{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/peremartra/Large-Language-Model-Notebooks-Course/blob/main/6-PRUNING/6_7_benchmark_inference_pruned_vs_base.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "725655d9",
      "metadata": {
        "id": "725655d9"
      },
      "source": [
        "<div>\n",
        "    <h1>Large Language Models Projects</a></h1>\n",
        "    <h3>Apply and Implement Strategies for Large Language Models</h3>\n",
        "    <h2>Inference Efficiency Benchmark: Base vs. Pruned Model</h2>\n",
        "    <h3>Evaluate speed and efficiency gains from structured pruning.</h3>\n",
        "</div>\n",
        "\n",
        "by [Pere Martra](https://www.linkedin.com/in/pere-martra/)\n",
        "_______\n",
        "Models: meta-llama/Llama-3.2-1B vs oopere/pruned40-llama-3.2-1B\n",
        "\n",
        "Colab Environment: GPU T4.\n",
        "\n",
        "Keys:\n",
        "* Inference\n",
        "* BenchMarks\n",
        "* PowerConsumption\n",
        "* CodeCarbon\n",
        "\n",
        "_______\n",
        "**disclaimer: The pruning / knowledge distillation section has been created after the first edition of the book was published. They are not included in the book’s original content but are intended to supplement and expand on the topics covered.**\n",
        "\n",
        "This is the unofficial repository for the book:\n",
        "        <a href=\"https://amzn.to/4eanT1g\"> <b>Large Language Models:</b> Apply and Implement Strategies for Large Language Models</a> (Apress).\n",
        "        The book is based on the content of this repository, but the notebooks are being updated, and I am incorporating new examples and chapters.\n",
        "        If you are looking for the official repository for the book, with the original notebooks, you should visit the\n",
        "        <a href=\"https://github.com/Apress/Large-Language-Models-Projects\">Apress repository</a>, where you can find all the notebooks in their original format as they appear in the book.\n",
        "\n",
        "______\n",
        "# INTRODUCTION\n",
        "This notebook benchmarks the **inference performance** of two Hugging Face models: a base model (`meta-llama/Llama-3.2-1B`) and its **pruned** version (`oopere/pruned40-llama-3.2-1B`).\n",
        "\n",
        "We evaluate and compare them in terms of:\n",
        "- **Latency** (including Time To First Token and token-level percentiles)\n",
        "- **Throughput** across different batch sizes\n",
        "- **GPU memory usage** for increasing context lengths\n",
        "- **Energy consumption and emissions**, using CodeCarbon\n",
        "\n",
        "Although this is an evaluation notebook, it is included in the **Pruning and Optimization** section because it directly analyzes the **impact of pruning techniques** on efficiency and environmental cost."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f62480d8",
      "metadata": {
        "id": "f62480d8"
      },
      "source": [
        "## 1. Configurations & Imports."
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install -q codecarbon"
      ],
      "metadata": {
        "id": "Y8Uix6ESeuIG",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "905a541c-2f47-47ab-f810-a510300d5501"
      },
      "id": "Y8Uix6ESeuIG",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[?25l   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/576.3 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K   \u001b[91m━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━\u001b[0m \u001b[32m368.6/576.3 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m576.3/576.3 kB\u001b[0m \u001b[31m10.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h\u001b[?25l   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/278.0 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m278.0/278.0 kB\u001b[0m \u001b[31m21.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.4/66.4 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m57.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.4/76.4 kB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.5/92.5 kB\u001b[0m \u001b[31m7.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
            "google-genai 1.10.0 requires httpx<1.0.0,>=0.28.1, but you have httpx 0.27.2 which is incompatible.\u001b[0m\u001b[31m\n",
            "\u001b[0m"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "92a5076f",
      "metadata": {
        "id": "92a5076f"
      },
      "outputs": [],
      "source": [
        "# Initial Configuration\n",
        "import os\n",
        "import time\n",
        "import json\n",
        "import torch\n",
        "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
        "import psutil\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "\n",
        "# Try importing CodeCarbon to track emissions\n",
        "try:\n",
        "    from codecarbon import EmissionsTracker\n",
        "    codecarbon_available = True\n",
        "except ImportError:\n",
        "    print(\"Warning: CodeCarbon is not installed. Environmental tracking will be skipped.\")\n",
        "    codecarbon_available = False\n",
        "\n",
        "# Try importing NVIDIA Management Library to retrieve GPU metrics\n",
        "try:\n",
        "    import pynvml\n",
        "    pynvml.nvmlInit()\n",
        "    gpu_available = True\n",
        "except ImportError:\n",
        "    print(\"Warning: pynvml is not installed. GPU metrics may be limited.\")\n",
        "    gpu_available = False\n",
        "\n",
        "# Detect devices: cuda > mps > cpu\n",
        "if torch.cuda.is_available():\n",
        "    device = \"cuda\"\n",
        "elif torch.backends.mps.is_available():\n",
        "    device = \"mps\"\n",
        "else:\n",
        "    device = \"cpu\"\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Model loading parameters\n",
        "USE_QUANTIZED = False  # Set to True to load in 8-bit mode"
      ],
      "metadata": {
        "id": "haui_hafnSmx"
      },
      "id": "haui_hafnSmx",
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "codecarbon_available"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "s2nNS9kee5SH",
        "outputId": "4a71b33b-baa8-45ea-b10a-3f2b7bcca171"
      },
      "id": "s2nNS9kee5SH",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "True"
            ]
          },
          "metadata": {},
          "execution_count": 4
        }
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2f9dbd66",
      "metadata": {
        "id": "2f9dbd66"
      },
      "source": [
        "## 2. Model and prompt loading functions\n",
        "In this section, we define utility functions to:\n",
        "\n",
        "* Load a model and its tokenizer from the Hugging Face Hub\n",
        "* Optionally enable 8-bit quantization for reduced memory usage\n",
        "* Load input prompts from either .json or .jsonl files\n",
        "* Provide a set of default prompts for quick testing\n",
        "\n",
        "These functions are designed to keep the benchmarking code clean, modular, and easy to adapt to different models and input formats."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "cbdae074",
      "metadata": {
        "id": "cbdae074"
      },
      "outputs": [],
      "source": [
        "# Function to load the model and tokenizer\n",
        "def load_model_and_tokenizer(model_id, use_quantized, device):\n",
        "    \"\"\"Loads the model and tokenizer from the Hugging Face Hub.\"\"\"\n",
        "    load_kwargs = {\"torch_dtype\": torch.float16} if device != \"cpu\" else {}\n",
        "    if use_quantized:\n",
        "        load_kwargs[\"load_in_8bit\"] = True\n",
        "    tokenizer = AutoTokenizer.from_pretrained(model_id)\n",
        "    if tokenizer.pad_token_id is None:\n",
        "      tokenizer.pad_token_id = tokenizer.eos_token_id\n",
        "    model = AutoModelForCausalLM.from_pretrained(model_id, **load_kwargs).to(device)\n",
        "    model.eval()\n",
        "    return model, tokenizer\n",
        "\n",
        "# Function to load prompts from a JSON or JSONL file\n",
        "def load_prompts_from_file(file_path):\n",
        "    \"\"\"Loads prompts from an external file (.json or .jsonl).\"\"\"\n",
        "    prompts = []\n",
        "    if file_path.endswith(\".json\"):\n",
        "        with open(file_path, \"r\", encoding=\"utf-8\") as f:\n",
        "            prompts = json.load(f)\n",
        "    elif file_path.endswith(\".jsonl\"):\n",
        "        with open(file_path, \"r\", encoding=\"utf-8\") as f:\n",
        "            prompts = [json.loads(line) for line in f]\n",
        "    else:\n",
        "        raise ValueError(\"Unsupported file format. Please use .json or .jsonl\")\n",
        "    return prompts\n",
        "\n",
        "# Lista de prompts por defecto\n",
        "example_prompts = [\n",
        "    \"Hello, how are you?\",\n",
        "    \"Write a poem about spring.\",\n",
        "    \"Summarize the plot of 'One Hundred Years of Solitude'.\",\n",
        "    \"Give three tips for maintaining a healthy lifestyle.\",\n",
        "    \"Explain the theory of relativity in simple terms.\"\n",
        "]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "05354a50",
      "metadata": {
        "id": "05354a50"
      },
      "source": [
        "## 3. Benchmarking functions\n",
        "This section defines all the necessary functions to evaluate the model's performance during inference. These functions allow you to measure several key aspects:\n",
        "\n",
        "* Latency: average time per token, TTFT (Time To First Token), and percentiles.\n",
        "* Throughput: tokens generated per second depending on batch size.\n",
        "* Resource usage: GPU and CPU utilization during generation.\n",
        "* Context scaling: how latency and memory usage change as prompt length increases.\n",
        "\n",
        "Energy consumption: total usage, estimated emissions, and per-token metrics (if CodeCarbon is available).\n",
        "\n",
        "These tools enable comparison of models in terms of computational efficiency and sustainability."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "90390495",
      "metadata": {
        "id": "90390495"
      },
      "outputs": [],
      "source": [
        "# Latency Benchmark\n",
        "def benchmark_latency(model, tokenizer, device, prompts):\n",
        "    \"\"\"\n",
        "    Measures latency: average time per token, TTFT, and percentiles.\n",
        "    \"\"\"\n",
        "    import numpy as np\n",
        "    tiempos_por_token = []\n",
        "    ttft_list = []\n",
        "    for prompt in prompts:\n",
        "        batch = tokenizer(prompt, return_tensors=\"pt\", padding=True).to(device)\n",
        "        start_time = time.time()\n",
        "        with torch.no_grad():\n",
        "            model.generate(\n",
        "                input_ids=batch[\"input_ids\"],\n",
        "                attention_mask=batch[\"attention_mask\"],\n",
        "                max_new_tokens=50,\n",
        "                pad_token_id=tokenizer.pad_token_id\n",
        "            )\n",
        "        end_time = time.time()\n",
        "        total = end_time - start_time\n",
        "        tiempos_por_token.extend([total/50] * 50)\n",
        "        ttft_list.append(total)\n",
        "    p50, p90, p99 = np.percentile(tiempos_por_token, [50, 90, 99])\n",
        "    return {\n",
        "        \"mean_token_time\": float(np.mean(tiempos_por_token)),\n",
        "        \"ttft_mean\": float(np.mean(ttft_list)),\n",
        "        \"p50\": float(p50),\n",
        "        \"p90\": float(p90),\n",
        "        \"p99\": float(p99)\n",
        "    }"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c941ed56",
      "metadata": {
        "id": "c941ed56"
      },
      "outputs": [],
      "source": [
        "# Throughput benchmark for different batch sizes\n",
        "def benchmark_throughput(model, tokenizer, device, prompts, batch_sizes=[1,4,8,16,32]):\n",
        "    import numpy as np\n",
        "    results = {}\n",
        "    handle = None\n",
        "    if gpu_available and device==\"cuda\":\n",
        "        handle = pynvml.nvmlDeviceGetHandleByIndex(0)\n",
        "\n",
        "    for bs in batch_sizes:\n",
        "        batch_prompts = prompts[:bs]\n",
        "        batch = tokenizer(batch_prompts, return_tensors=\"pt\", padding=True, truncation=True).to(device)\n",
        "\n",
        "        # Measure peak memory usage\n",
        "        if device==\"cuda\":\n",
        "            torch.cuda.reset_peak_memory_stats()\n",
        "\n",
        "        # Synchronize and measure real time\n",
        "        if device==\"cuda\":\n",
        "            torch.cuda.synchronize()\n",
        "        start = time.time()\n",
        "\n",
        "        with torch.no_grad():\n",
        "            model.generate(\n",
        "                input_ids=batch[\"input_ids\"],\n",
        "                attention_mask=batch[\"attention_mask\"],\n",
        "                max_new_tokens=50,\n",
        "                pad_token_id=tokenizer.pad_token_id\n",
        "            )\n",
        "\n",
        "        if device==\"cuda\":\n",
        "            torch.cuda.synchronize()\n",
        "        end = time.time()\n",
        "\n",
        "        # Collect metrics\n",
        "        tokens = bs * 50\n",
        "        peak_mem = (torch.cuda.max_memory_allocated(device) / 1024**2) if device==\"cuda\" else None\n",
        "        gpu_util = pynvml.nvmlDeviceGetUtilizationRates(handle).gpu if handle else None\n",
        "        results[f\"batch_{bs}\"] = {\n",
        "            \"tokens_per_sec\": tokens / (end - start),\n",
        "            \"peak_mem_mb\": peak_mem,\n",
        "            \"gpu_util_pct\": gpu_util\n",
        "        }\n",
        "\n",
        "    return results"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "82ff1624",
      "metadata": {
        "id": "82ff1624"
      },
      "outputs": [],
      "source": [
        "# Context scaling benchmark\n",
        "def benchmark_context_scaling(model, tokenizer, device, context_lengths=[512,1024,2048,4096]):\n",
        "    \"\"\"Evaluates latency and throughput for different context lengths.\"\"\"\n",
        "    results = {}\n",
        "    base_prompt = \"word \" * max(context_lengths)\n",
        "    for length in context_lengths:\n",
        "        inputs = tokenizer(base_prompt, return_tensors=\"pt\", max_length=length, truncation=True).to(device)\n",
        "        start = time.time()\n",
        "        with torch.no_grad():\n",
        "            model.generate(**inputs, max_new_tokens=10)\n",
        "        end = time.time()\n",
        "        dur = end - start\n",
        "        results[f\"context_{length}\"] = {\n",
        "            \"latency\": dur,\n",
        "            \"throughput\": 10 / dur\n",
        "        }\n",
        "    return results"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def benchmark_memory_context_scaling(model, tokenizer, device, context_lengths=[512,1024,2048,4096]):\n",
        "    \"\"\"\n",
        "    For each length in context_lengths:\n",
        "      Generate a sufficiently long prompt\n",
        "\n",
        "      Measure GPU peak memory (in MB)\n",
        "      Returns a dict: {\"512\": peak_mb, \"1024\": peak_mb, …}\n",
        "    \"\"\"\n",
        "    results = {}\n",
        "    base = \"palabra \" * max(context_lengths)\n",
        "    for L in context_lengths:\n",
        "        # Prepara el batch con truncation\n",
        "        inputs = tokenizer(base, return_tensors=\"pt\", max_length=L, truncation=True).to(device)\n",
        "        if device==\"cuda\":\n",
        "            # Resetea contadores\n",
        "            torch.cuda.reset_peak_memory_stats()\n",
        "        with torch.no_grad():\n",
        "            model.generate(**inputs, max_new_tokens=1)\n",
        "        if device==\"cuda\":\n",
        "            peak = torch.cuda.max_memory_allocated(device) / 1024**2\n",
        "        else:\n",
        "            peak = None\n",
        "        results[L] = peak\n",
        "    return results"
      ],
      "metadata": {
        "id": "oX7KWG2eEofQ"
      },
      "id": "oX7KWG2eEofQ",
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ac5b98f2",
      "metadata": {
        "id": "ac5b98f2"
      },
      "outputs": [],
      "source": [
        "# Resources Benchmark (GPU y CPU)\n",
        "def benchmark_resource_usage(model, tokenizer, device, prompts):\n",
        "    \"\"\"Measures GPU and CPU utilization during inference.\"\"\"\n",
        "    data = {}\n",
        "    for p in prompts:\n",
        "        inputs = tokenizer(p, return_tensors=\"pt\").to(device)\n",
        "        if gpu_available:\n",
        "            handle = pynvml.nvmlDeviceGetHandleByIndex(0)\n",
        "            mem = pynvml.nvmlDeviceGetMemoryInfo(handle)\n",
        "            util = pynvml.nvmlDeviceGetUtilizationRates(handle)\n",
        "            power = pynvml.nvmlDeviceGetPowerUsage(handle)/1000.0\n",
        "        else:\n",
        "            mem = util = power = None\n",
        "        cpu = psutil.cpu_percent(interval=None)\n",
        "        data[p] = {\n",
        "            \"gpu_mem_used\": mem.used if mem else None,\n",
        "            \"gpu_util\": util.gpu if util else None,\n",
        "            \"gpu_power_w\": power,\n",
        "            \"cpu_util\": cpu\n",
        "        }\n",
        "    return data"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cb711211",
      "metadata": {
        "id": "cb711211"
      },
      "source": [
        "## 4. Results visualization\n",
        "This section includes functions to visually represent the results obtained during benchmarking. These visualizations allow for a more intuitive and comparative analysis of the performance of the evaluated models.\n",
        "\n",
        "The following aspects are covered:\n",
        "\n",
        "* Latency: comparison of TTFT and per-token times with percentiles.\n",
        "* Throughput: tokens per second as a function of batch size.\n",
        "* Memory usage: GPU consumption as context length increases.\n",
        "* Environmental impact: energy consumption, average power, and emissions per token.\n",
        "\n",
        "These charts help identify bottlenecks, efficiency advantages, and the real impact of techniques like structured pruning."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "91da4fc1",
      "metadata": {
        "id": "91da4fc1"
      },
      "outputs": [],
      "source": [
        "# Visualization functions.\n",
        "def plot_latency(latency, latency2=None):\n",
        "    \"\"\"\n",
        "    Draw two bar charts side by side:\n",
        "      - Left: only TTFT (ttft_mean)\n",
        "      - Right: mean_token_time and percentiles p50, p90, p99\n",
        "    If a second result (latency2) is provided, plot both sets in different colors for comparison.\n",
        "    \"\"\"\n",
        "    import numpy as np\n",
        "    import matplotlib.pyplot as plt\n",
        "\n",
        "    # Figure setup and bar width configuration\n",
        "    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))\n",
        "    width = 0.35\n",
        "\n",
        "    # --- Chart 1: TTFT (ttft_mean) ---\n",
        "    métricas1 = [\"ttft_mean\"]\n",
        "    x1 = np.arange(len(métricas1))\n",
        "    # Result 1\n",
        "    ax1.bar(x1 - width/2, [latency[\"ttft_mean\"]], width, label=\"Result 1\", color=\"tab:blue\")\n",
        "    # Result 2 (if exists)\n",
        "    if latency2 is not None:\n",
        "        ax1.bar(x1 + width/2, [latency2[\"ttft_mean\"]], width, label=\"Result 2\", color=\"tab:orange\")\n",
        "    ax1.set_title(\"Time to First Token (TTFT)\")\n",
        "    ax1.set_ylabel(\"Seconds\")\n",
        "    ax1.set_xticks(x1)\n",
        "    ax1.set_xticklabels(métricas1)\n",
        "    ax1.tick_params(axis=\"x\", rotation=0)\n",
        "    if latency2 is not None:\n",
        "        ax1.legend()\n",
        "\n",
        "    # --- Chart 2: Mean token time + percentiles ---\n",
        "    métricas2 = [\"mean_token_time\", \"p50\", \"p90\", \"p99\"]\n",
        "    x2 = np.arange(len(métricas2))\n",
        "    # Result 1\n",
        "    ax2.bar(x2 - width/2, [latency[m] for m in métricas2], width, label=\"Result 1\", color=\"tab:blue\")\n",
        "    # Result 2 (if exists)\n",
        "    if latency2 is not None:\n",
        "        ax2.bar(x2 + width/2, [latency2[m] for m in métricas2], width, label=\"Result 2\", color=\"tab:orange\")\n",
        "    ax2.set_title(\"Mean Token Time and Percentiles\")\n",
        "    ax2.set_ylabel(\"Seconds\")\n",
        "    ax2.set_xticks(x2)\n",
        "    ax2.set_xticklabels(métricas2)\n",
        "    ax2.tick_params(axis=\"x\", rotation=0)\n",
        "    if latency2 is not None:\n",
        "        ax2.legend()\n",
        "\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "def plot_throughput(results1, results2=None):\n",
        "    \"\"\"\n",
        "    Compares throughput from one or two results:\n",
        "      - Throughput (tokens/s) as bars.\n",
        "      - Use colors tab:blue and tab:orange (same as plot_latency).\n",
        "      - Annotate average prompt length for each model.\n",
        "    \"\"\"\n",
        "    # Throughput data\n",
        "    tp1 = results1[\"throughput_metrics\"]\n",
        "    batches = sorted(int(k.split('_')[1]) for k in tp1.keys())\n",
        "    x = np.arange(len(batches))\n",
        "    width = 0.35\n",
        "\n",
        "    tokens1 = [tp1[f\"batch_{b}\"][\"tokens_per_sec\"] for b in batches]\n",
        "\n",
        "    if results2:\n",
        "        tp2 = results2[\"throughput_metrics\"]\n",
        "        tokens2 = [tp2[f\"batch_{b}\"][\"tokens_per_sec\"] for b in batches]\n",
        "\n",
        "    # Plot\n",
        "    plt.figure(figsize=(8, 4))\n",
        "    plt.bar(x - width/2, tokens1, width, label=\"Model 1\", color=\"tab:blue\")\n",
        "    if results2:\n",
        "        plt.bar(x + width/2, tokens2, width, label=\"Model 2\", color=\"tab:orange\")\n",
        "    plt.xlabel(\"Batch size\")\n",
        "    plt.ylabel(\"Tokens/s\")\n",
        "    plt.title(\"Throughput vs Batch size\")\n",
        "    plt.xticks(x, batches)\n",
        "\n",
        "    # Average prompt length annotation\n",
        "    notes = []\n",
        "    m1 = results1.get(\"prompt_stats\", {}).get(\"mean_length\")\n",
        "    if m1:\n",
        "        notes.append(f\"M1 long. average prompts: {m1:.1f}\")\n",
        "    if results2:\n",
        "        m2 = results2.get(\"prompt_stats\", {}).get(\"mean_length\")\n",
        "        if m2:\n",
        "            notes.append(f\"M2 long. average prompts: {m2:.1f}\")\n",
        "    if notes:\n",
        "        plt.text(\n",
        "            0.95, 0.95,\n",
        "            \"\\n\".join(notes),\n",
        "            transform=plt.gca().transAxes,\n",
        "            ha=\"right\", va=\"top\",\n",
        "            bbox=dict(boxstyle=\"round,pad=0.3\", facecolor=\"white\", alpha=0.7)\n",
        "        )\n",
        "\n",
        "    if results2:\n",
        "        plt.legend()\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "def plot_memory_scaling(results1, results2=None):\n",
        "    \"\"\"\n",
        "    Compares peak memory usage as a function of context length\n",
        "    for one or two sets of results.\n",
        "      Parameters:\n",
        "        results1: a 'results' dictionary with 'memory_context_metrics'\n",
        "        results2: (optional) second 'results' dictionary\n",
        "    \"\"\"\n",
        "    # Extract memory metrics by context length\n",
        "    mem1 = results1.get(\"memory_context_metrics\", {})\n",
        "    if not mem1:\n",
        "        print(\"No memory_context_metrics data found in results1.\")\n",
        "        return\n",
        "    # Order context\n",
        "    ctx1, vals1 = zip(*sorted(mem1.items()))\n",
        "\n",
        "    # Get figure ready\n",
        "    plt.figure(figsize=(6,4))\n",
        "    plt.plot(ctx1, vals1, marker=\"o\", linestyle=\"-\", label=\"Modelo 1\", color=\"tab:blue\")\n",
        "\n",
        "    # process second results\n",
        "    if results2:\n",
        "        mem2 = results2.get(\"memory_context_metrics\", {})\n",
        "        if mem2:\n",
        "            ctx2, vals2 = zip(*sorted(mem2.items()))\n",
        "            # Verificar que ctx2 coincide con ctx1 para comparar\n",
        "            if list(ctx2) != list(ctx1):\n",
        "                print(\"Warning: The context lengths in results2 differ. They will be plotted separately.\")\n",
        "            plt.plot(ctx2, vals2, marker=\"x\", linestyle=\"--\", label=\"Modelo 2\", color=\"tab:orange\")\n",
        "\n",
        "    # Labels\n",
        "    plt.title(\"Memory vs Context Length\")\n",
        "    plt.xlabel(\"Context (tokens)\")\n",
        "    plt.ylabel(\"Memory peak (MB)\")\n",
        "    plt.xticks(ctx1)\n",
        "    plt.grid(alpha=0.3)\n",
        "    plt.legend()\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "def plot_environmental_comparison(results1, results2):\n",
        "    \"\"\"\n",
        "      Compares environmental metrics in three separate subplots:\n",
        "      - Average power (W)\n",
        "      - Energy per token (kWh)\n",
        "      - Emissions per token (kg CO₂)\n",
        "    \"\"\"\n",
        "    ei1 = results1[\"environmental_impact\"]\n",
        "    ei2 = results2[\"environmental_impact\"]\n",
        "\n",
        "    metrics = [\n",
        "        (\"avg_power_w\", \"Average power (W)\"),\n",
        "        (\"energy_per_token_kwh\", \"Energy/token (kWh)\"),\n",
        "        (\"emissions_per_token_kg\", \"Emissions/token (kg CO₂)\")\n",
        "    ]\n",
        "\n",
        "    fig, axes = plt.subplots(1, 3, figsize=(14, 4))\n",
        "\n",
        "    for ax, (key, label) in zip(axes, metrics):\n",
        "        # Extraer valores\n",
        "        v1 = ei1.get(key, 0)\n",
        "        v2 = ei2.get(key, 0)\n",
        "\n",
        "        # Dibujar barras\n",
        "        ax.bar([\"Model 1\", \"Model 2\"], [v1, v2], color=[\"tab:blue\", \"tab:orange\"])\n",
        "        ax.set_title(label)\n",
        "        ax.set_ylabel(label)\n",
        "\n",
        "        # Rotar y alinear etiquetas X\n",
        "        ax.tick_params(axis=\"x\", labelrotation=45)\n",
        "        # Alineación horizontal de cada etiqueta\n",
        "        for lbl in ax.get_xticklabels():\n",
        "            lbl.set_ha(\"right\")\n",
        "\n",
        "        # Anotar valor encima de las barras\n",
        "        for i, v in enumerate([v1, v2]):\n",
        "            texto = f\"{v:.2e}\" if abs(v) < 1e-2 else f\"{v:.2f}\"\n",
        "            ax.text(i, v * 1.01, texto, ha=\"center\", va=\"bottom\")\n",
        "\n",
        "    plt.suptitle(\"Environmental comparison per token / average power\")\n",
        "    plt.tight_layout(rect=[0, 0, 1, 0.95])\n",
        "    plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6fafe8d1",
      "metadata": {
        "id": "6fafe8d1"
      },
      "source": [
        "## 5. Full execution and result saving\n",
        "\n",
        "This section brings together all the previous functions into a single workflow that:\n",
        "\n",
        "- Runs the various performance and environmental impact benchmarks.  \n",
        "- Collects and organizes the metrics into a single structured dictionary.  \n",
        "- Computes additional indicators such as energy per token and average power.  \n",
        "- Saves the results in a benchmark_results.json file for later analysis.  \n",
        "\n",
        "This block allows automated model evaluation with a single line of code, making it easier to systematically compare different versions or optimized variants."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "47cb0de5",
      "metadata": {
        "id": "47cb0de5"
      },
      "outputs": [],
      "source": [
        "def run_all_benchmarks(model, tokenizer, device, prompts):\n",
        "    results = {}\n",
        "    # Prompt length statistics\n",
        "    token_lengths = [len(tokenizer.encode(p)) for p in prompts]\n",
        "    results[\"prompt_stats\"] = {\n",
        "        \"lengths\": token_lengths,\n",
        "        \"mean_length\": sum(token_lengths) / len(token_lengths)\n",
        "    }\n",
        "    # 1. Prepare environmental tracking\n",
        "    env_start = time.time()\n",
        "    if codecarbon_available:\n",
        "        try:\n",
        "            # Some versions need 2-letter country codes some others 3-letter code.\n",
        "            tracker = EmissionsTracker(country_iso_code=\"ESP\")\n",
        "        except TypeError:\n",
        "            print(\"Warning: 'country_iso_code' incorrect. Using default configuration.\")\n",
        "            tracker = EmissionsTracker()\n",
        "        tracker.start()\n",
        "\n",
        "    # 2. model info.\n",
        "    results[\"model_info\"] = {\n",
        "        \"base_model\": model.config._name_or_path,\n",
        "        \"quantized\": USE_QUANTIZED,\n",
        "        \"device\": device,\n",
        "        \"torch_version\": torch.__version__,\n",
        "        \"cuda_available\": torch.cuda.is_available(),\n",
        "        \"timestamp\": time.strftime(\"%Y-%m-%dT%H:%M:%S\", time.localtime())\n",
        "    }\n",
        "\n",
        "    # 3. Run benchmarks\n",
        "    results[\"latency_metrics\"]    = benchmark_latency(model, tokenizer, device, prompts)\n",
        "    results[\"throughput_metrics\"] = benchmark_throughput(model, tokenizer, device, prompts)\n",
        "    results[\"context_metrics\"]    = benchmark_context_scaling(model, tokenizer, device)\n",
        "    results[\"resource_metrics\"]   = benchmark_resource_usage(model, tokenizer, device, prompts)\n",
        "    results[\"memory_context_metrics\"] = benchmark_memory_context_scaling(model, tokenizer, device)\n",
        "\n",
        "    # 4. Stop and collect environmental impact data\n",
        "    if codecarbon_available:\n",
        "        # tracker.stop() Returns the energy consumed in kWh (float) :contentReference[oaicite:3]{index=3}\n",
        "        energy_kwh = tracker.stop()\n",
        "        # tracker.flush() Writes to disk/API and returns emissions in kg of CO₂ :contentReference[oaicite:4]{index=4}\n",
        "        emissions_kg = tracker.flush()\n",
        "        duration = time.time() - env_start\n",
        "\n",
        "        results[\"environmental_impact\"] = {\n",
        "            \"energy_consumed_kwh\": energy_kwh,\n",
        "            \"emissions_kg\": emissions_kg,\n",
        "            \"country\": getattr(tracker, \"country_iso_code\", \"N/A\"),\n",
        "            \"duration_seconds\": duration\n",
        "        }\n",
        "\n",
        "        ei = results[\"environmental_impact\"]\n",
        "        energy_kwh   = ei[\"energy_consumed_kwh\"]\n",
        "        emissions_kg = ei[\"emissions_kg\"]\n",
        "        duration_s   = ei[\"duration_seconds\"]\n",
        "\n",
        "        # 1) Average power (W)\n",
        "        #   1 kWh = 1000 Wh, y power = Wh / (s/3600)\n",
        "        avg_power_w = (energy_kwh * 1000) / (duration_s / 3600)\n",
        "\n",
        "        # 2) Throughput total tokens generated(sum bs*50)\n",
        "        batch_sizes = [int(k.split(\"_\")[1]) for k in results[\"throughput_metrics\"].keys()]\n",
        "        total_tokens = sum(batch_sizes) * 50\n",
        "\n",
        "        # 3) Consumption per token (kWh/token) and emissions per token (kg/token)\n",
        "        energy_per_token   = energy_kwh / total_tokens\n",
        "        emissions_per_token = emissions_kg / total_tokens\n",
        "\n",
        "        # Guardar en el mismo bloque de environmental_impact\n",
        "        ei.update({\n",
        "            \"avg_power_w\": avg_power_w,\n",
        "            \"energy_per_token_kwh\": energy_per_token,\n",
        "            \"emissions_per_token_kg\": emissions_per_token\n",
        "        })\n",
        "\n",
        "\n",
        "    # 5. Guardar a JSON\n",
        "    with open(\"benchmark_results.json\", \"w\", encoding=\"utf-8\") as f:\n",
        "        json.dump(results, f, indent=4, ensure_ascii=False)\n",
        "    print(\"Results stored at benchmark_results.json\")\n",
        "    return results\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Load models and ejecution\n",
        "model, tokenizer = load_model_and_tokenizer(\"meta-llama/Llama-3.2-1B\", USE_QUANTIZED, device)\n",
        "model2, tokenizer = load_model_and_tokenizer(\"oopere/pruned40-llama-3.2-1B\", USE_QUANTIZED, device)\n",
        "prompts = example_prompts\n"
      ],
      "metadata": {
        "id": "vWmO_sNvNSHc"
      },
      "id": "vWmO_sNvNSHc",
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "results = run_all_benchmarks(model, tokenizer, device, prompts)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cYnMNj06Uepy",
        "outputId": "0cdbde85-7537-4938-a54a-f2c94739922f"
      },
      "id": "cYnMNj06Uepy",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[codecarbon WARNING @ 09:08:42] Multiple instances of codecarbon are allowed to run at the same time.\n",
            "[codecarbon INFO @ 09:08:42] [setup] RAM Tracking...\n",
            "[codecarbon INFO @ 09:08:42] [setup] CPU Tracking...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Warning: 'country_iso_code' incorrect. Using default configuration.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[codecarbon WARNING @ 09:08:43] We saw that you have a Intel(R) Xeon(R) CPU @ 2.30GHz but we don't know it. Please contact us.\n",
            "[codecarbon WARNING @ 09:08:43] No CPU tracking mode found. Falling back on estimation based on TDP for CPU. \n",
            " Linux OS detected: Please ensure RAPL files exist at /sys/class/powercap/intel-rapl/subsystem to measure CPU\n",
            "\n",
            "[codecarbon INFO @ 09:08:43] CPU Model on constant consumption mode: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
            "[codecarbon WARNING @ 09:08:43] No CPU tracking mode found. Falling back on CPU constant mode.\n",
            "[codecarbon INFO @ 09:08:43] [setup] GPU Tracking...\n",
            "[codecarbon INFO @ 09:08:43] Tracking Nvidia GPU via pynvml\n",
            "[codecarbon INFO @ 09:08:43] The below tracking methods have been set up:\n",
            "                RAM Tracking Method: RAM power estimation model\n",
            "                CPU Tracking Method: global constant\n",
            "                GPU Tracking Method: pynvml\n",
            "            \n",
            "[codecarbon INFO @ 09:08:43] >>> Tracker's metadata:\n",
            "[codecarbon INFO @ 09:08:43]   Platform system: Linux-6.1.123+-x86_64-with-glibc2.35\n",
            "[codecarbon INFO @ 09:08:43]   Python version: 3.11.12\n",
            "[codecarbon INFO @ 09:08:43]   CodeCarbon version: 3.0.0\n",
            "[codecarbon INFO @ 09:08:43]   Available RAM : 50.993 GB\n",
            "[codecarbon INFO @ 09:08:43]   CPU count: 8 thread(s) in 1 physical CPU(s)\n",
            "[codecarbon INFO @ 09:08:43]   CPU model: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
            "[codecarbon INFO @ 09:08:43]   GPU count: 1\n",
            "[codecarbon INFO @ 09:08:43]   GPU model: 1 x Tesla T4\n",
            "[codecarbon INFO @ 09:08:43] Emissions data (if any) will be saved to file /content/emissions.csv\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for RAM : 0.000083 kWh. RAM Power : 20.0 W\n",
            "[codecarbon INFO @ 09:08:58] Delta energy consumed for CPU with constant : 0.000177 kWh, power : 42.5 W\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for All CPU : 0.000177 kWh\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for all GPUs : 0.000254 kWh. Total GPU Power : 60.93073133154665 W\n",
            "[codecarbon INFO @ 09:08:58] 0.000514 kWh of electricity used since the beginning.\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for RAM : 0.000085 kWh. RAM Power : 20.0 W\n",
            "[codecarbon INFO @ 09:08:58] Delta energy consumed for CPU with constant : 0.000003 kWh, power : 42.5 W\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for All CPU : 0.000180 kWh\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for all GPUs : 0.000258 kWh. Total GPU Power : 52.01722249917276 W\n",
            "[codecarbon INFO @ 09:08:58] 0.000523 kWh of electricity used since the beginning.\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for RAM : 0.000085 kWh. RAM Power : 20.0 W\n",
            "[codecarbon INFO @ 09:08:58] Delta energy consumed for CPU with constant : 0.000000 kWh, power : 42.5 W\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for All CPU : 0.000181 kWh\n",
            "[codecarbon INFO @ 09:08:58] Energy consumed for all GPUs : 0.000260 kWh. Total GPU Power : 384.13775548880386 W\n",
            "[codecarbon INFO @ 09:08:58] 0.000525 kWh of electricity used since the beginning.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Results stored at benchmark_results.json\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "results"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BFZq_RE6eMT3",
        "outputId": "e14df5f3-eac0-47b6-aa1f-67e0bfe0c185"
      },
      "id": "BFZq_RE6eMT3",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'prompt_stats': {'lengths': [7, 7, 15, 10, 12], 'mean_length': 10.2},\n",
              " 'model_info': {'base_model': 'meta-llama/Llama-3.2-1B',\n",
              "  'quantized': False,\n",
              "  'device': 'cuda',\n",
              "  'torch_version': '2.6.0+cu124',\n",
              "  'cuda_available': True,\n",
              "  'timestamp': '2025-04-19T09:08:43'},\n",
              " 'latency_metrics': {'mean_token_time': 0.027237844467163087,\n",
              "  'ttft_mean': 1.3618922233581543,\n",
              "  'p50': 0.021362671852111815,\n",
              "  'p90': 0.05069376468658447,\n",
              "  'p99': 0.05069376468658447},\n",
              " 'throughput_metrics': {'batch_1': {'tokens_per_sec': 47.655007298845454,\n",
              "   'peak_mem_mb': 4156.31005859375,\n",
              "   'gpu_util_pct': 58},\n",
              "  'batch_4': {'tokens_per_sec': 152.26674590449747,\n",
              "   'peak_mem_mb': 4187.0498046875,\n",
              "   'gpu_util_pct': 57},\n",
              "  'batch_8': {'tokens_per_sec': 331.5113518008025,\n",
              "   'peak_mem_mb': 4197.5302734375,\n",
              "   'gpu_util_pct': 62},\n",
              "  'batch_16': {'tokens_per_sec': 675.0613761989307,\n",
              "   'peak_mem_mb': 4197.5302734375,\n",
              "   'gpu_util_pct': 61},\n",
              "  'batch_32': {'tokens_per_sec': 1330.4388183060853,\n",
              "   'peak_mem_mb': 4197.5302734375,\n",
              "   'gpu_util_pct': 62}},\n",
              " 'context_metrics': {'context_512': {'latency': 0.23646211624145508,\n",
              "   'throughput': 42.29007233356927},\n",
              "  'context_1024': {'latency': 0.2832949161529541,\n",
              "   'throughput': 35.29890382713712},\n",
              "  'context_2048': {'latency': 0.3834495544433594,\n",
              "   'throughput': 26.079049731891484},\n",
              "  'context_4096': {'latency': 0.6836550235748291,\n",
              "   'throughput': 14.627260321602034}},\n",
              " 'resource_metrics': {'Hello, how are you?': {'gpu_mem_used': 5280497664,\n",
              "   'gpu_util': 95,\n",
              "   'gpu_power_w': 68.471,\n",
              "   'cpu_util': 24.0},\n",
              "  'Write a poem about spring.': {'gpu_mem_used': 5280497664,\n",
              "   'gpu_util': 95,\n",
              "   'gpu_power_w': 68.471,\n",
              "   'cpu_util': 33.3},\n",
              "  \"Summarize the plot of 'One Hundred Years of Solitude'.\": {'gpu_mem_used': 5280497664,\n",
              "   'gpu_util': 95,\n",
              "   'gpu_power_w': 68.471,\n",
              "   'cpu_util': 0.0},\n",
              "  'Give three tips for maintaining a healthy lifestyle.': {'gpu_mem_used': 5280497664,\n",
              "   'gpu_util': 95,\n",
              "   'gpu_power_w': 68.471,\n",
              "   'cpu_util': 0.0},\n",
              "  'Explain the theory of relativity in simple terms.': {'gpu_mem_used': 5280497664,\n",
              "   'gpu_util': 95,\n",
              "   'gpu_power_w': 68.471,\n",
              "   'cpu_util': 33.3}},\n",
              " 'memory_context_metrics': {512: 4196.52978515625,\n",
              "  1024: 4244.67431640625,\n",
              "  2048: 4340.96337890625,\n",
              "  4096: 4533.54150390625},\n",
              " 'environmental_impact': {'energy_consumed_kwh': 0.0001493398639754712,\n",
              "  'emissions_kg': 0.00014988403166783367,\n",
              "  'country': 'N/A',\n",
              "  'duration_seconds': 16.612079620361328,\n",
              "  'avg_power_w': 32.36340798973382,\n",
              "  'energy_per_token_kwh': 4.8963889828023346e-08,\n",
              "  'emissions_per_token_kg': 4.91423054648635e-08}}"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "results2 = run_all_benchmarks(model2, tokenizer, device, prompts)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BAe7I0aAsh_s",
        "outputId": "88fd3cfc-f0ed-49da-b023-84b5360abeaa"
      },
      "id": "BAe7I0aAsh_s",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[codecarbon WARNING @ 09:08:58] Multiple instances of codecarbon are allowed to run at the same time.\n",
            "[codecarbon INFO @ 09:08:58] [setup] RAM Tracking...\n",
            "[codecarbon INFO @ 09:08:58] [setup] CPU Tracking...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Warning: 'country_iso_code' incorrect. Using default configuration.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[codecarbon WARNING @ 09:09:00] We saw that you have a Intel(R) Xeon(R) CPU @ 2.30GHz but we don't know it. Please contact us.\n",
            "[codecarbon WARNING @ 09:09:00] No CPU tracking mode found. Falling back on estimation based on TDP for CPU. \n",
            " Linux OS detected: Please ensure RAPL files exist at /sys/class/powercap/intel-rapl/subsystem to measure CPU\n",
            "\n",
            "[codecarbon INFO @ 09:09:00] CPU Model on constant consumption mode: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
            "[codecarbon WARNING @ 09:09:00] No CPU tracking mode found. Falling back on CPU constant mode.\n",
            "[codecarbon INFO @ 09:09:00] [setup] GPU Tracking...\n",
            "[codecarbon INFO @ 09:09:00] Tracking Nvidia GPU via pynvml\n",
            "[codecarbon INFO @ 09:09:00] The below tracking methods have been set up:\n",
            "                RAM Tracking Method: RAM power estimation model\n",
            "                CPU Tracking Method: global constant\n",
            "                GPU Tracking Method: pynvml\n",
            "            \n",
            "[codecarbon INFO @ 09:09:00] >>> Tracker's metadata:\n",
            "[codecarbon INFO @ 09:09:00]   Platform system: Linux-6.1.123+-x86_64-with-glibc2.35\n",
            "[codecarbon INFO @ 09:09:00]   Python version: 3.11.12\n",
            "[codecarbon INFO @ 09:09:00]   CodeCarbon version: 3.0.0\n",
            "[codecarbon INFO @ 09:09:00]   Available RAM : 50.993 GB\n",
            "[codecarbon INFO @ 09:09:00]   CPU count: 8 thread(s) in 1 physical CPU(s)\n",
            "[codecarbon INFO @ 09:09:00]   CPU model: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
            "[codecarbon INFO @ 09:09:00]   GPU count: 1\n",
            "[codecarbon INFO @ 09:09:00]   GPU model: 1 x Tesla T4\n",
            "[codecarbon INFO @ 09:09:00] Emissions data (if any) will be saved to file /content/emissions.csv\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "Setting `pad_token_id` to `eos_token_id`:128001 for open-end generation.\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for RAM : 0.000076 kWh. RAM Power : 20.0 W\n",
            "[codecarbon INFO @ 09:09:13] Delta energy consumed for CPU with constant : 0.000162 kWh, power : 42.5 W\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for All CPU : 0.000162 kWh\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for all GPUs : 0.000234 kWh. Total GPU Power : 61.57340402396222 W\n",
            "[codecarbon INFO @ 09:09:13] 0.000472 kWh of electricity used since the beginning.\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for RAM : 0.000076 kWh. RAM Power : 20.0 W\n",
            "[codecarbon INFO @ 09:09:13] Delta energy consumed for CPU with constant : 0.000000 kWh, power : 42.5 W\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for All CPU : 0.000162 kWh\n",
            "[codecarbon INFO @ 09:09:13] Energy consumed for all GPUs : 0.000234 kWh. Total GPU Power : 0.0 W\n",
            "[codecarbon INFO @ 09:09:13] 0.000472 kWh of electricity used since the beginning.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Results stored at benchmark_results.json\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# 6. Plot results.\n",
        "This section visualizes the benchmarking results to make comparisons more intuitive and interpretable.\n",
        "\n",
        "* Each plot focuses on a specific aspect of model performance:\n",
        "* Latency metrics: including mean token time and percentiles (P50, P90, P99)\n",
        "* Throughput vs. batch size: to identify the most efficient batch size\n",
        "* GPU memory usage: across different context lengths\n",
        "* Environmental impact: including energy per token and CO₂ emissions\n",
        "\n",
        "These plots help highlight the practical differences between the base and pruned models, not only in speed and memory consumption, but also in sustainability."
      ],
      "metadata": {
        "id": "5Ub6ZRRm_NUQ"
      },
      "id": "5Ub6ZRRm_NUQ"
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Latency."
      ],
      "metadata": {
        "id": "2bCEYZXk_rhY"
      },
      "id": "2bCEYZXk_rhY"
    },
    {
      "cell_type": "code",
      "source": [
        "plot_latency(results[\"latency_metrics\"], results2[\"latency_metrics\"])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 404
        },
        "id": "tym_152iURIm",
        "outputId": "0888c9cd-95ee-4568-dad6-8470ce03de84"
      },
      "id": "tym_152iURIm",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1200x400 with 2 Axes>"
            ],
            "image/png": "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qnLlyqlDhw7avn27Wb2CHp/169eradOmcnJyUtOmTfW///2vAEcpO2dnZz300ENKTU01jb8Kel7nzJljivu3336TdGMs2KdPH7m5uals2bJq0KBBthnkp06d0nPPPSd3d3c5OjqqSZMmWrx4sVmdmJgY2djY6D//+Y/eeecd3XfffXJyclKXLl10+PBhU72OHTtq06ZNOnHihGlsnPU3SEHWdv3ss8/k7e2tsmXLqnLlynrmmWd08uRJszq3G6cDWUiTAyXYihUrlJ6erldeeUUXLlzQ9OnT1adPH3Xu3FkxMTF68803dfjwYb3//vsaNWqU2RvUp59+qsGDBysgIEDTpk3TlStX9OGHH6p9+/bat29frrflPfLII3r11Vez3aaV9e/EiRM1adIk+fv766WXXtLBgwf14Ycf6scff9R3332Xr0+OkpOTs32KevP08ltdv35dAQEBat++vWbMmCFnZ2elp6crICBAaWlpeuWVV+Th4aFTp05p48aNunjxolxdXfXpp5/q+eefV9u2bTV8+HBJUt26dW8bX24K2/eNGzfq6aefVt++fbV48WLZ2dnp119/1cMPP6yaNWtqzJgxKleunP7zn/8oKChI//3vf/Xkk0+abeOVV15RpUqVFB4eruPHj2vOnDkKCQnRmjVr8ox5165dsrGxUatWrQrd74K4du1atnPr7OwsZ2fnQm2vdevW+RrUAgAsx8vLS76+vlq1apW6d+8u6cYHYcnJyXrmmWf03nvvZWvzwgsvaOnSpQoODtarr76qY8eOad68edq3b5/Ze+jSpUtVvnx5hYaGqnz58vr66681YcIEpaSk6N133zXb5t9//63AwEA99dRT6tOnj9auXas333xTzZo1M8VVGNu2bVP37t1Vp04dTZw4UVevXtX777+vhx9+WHFxcbmOoY4cOaLOnTurcuXKioqKUtWqVXXlyhX5+fnp1KlTeuGFF3T//fdr165dCgsL0+nTp7Ot7bNy5UpdunRJL7zwgmxsbDR9+nQ99dRTOnr0aLHeVvXtt9/q888/14gRIyRJEREReuyxx/TGG2/ogw8+0Msvv6y///5b06dP13PPPaevv/7a1Pbrr79W9+7d5e3trfDwcNna2mrJkiXq3Lmzvv32W7Vt2zbX/aakpOjjjz9Wv379NGzYMF26dEmffPKJAgICtHv3brVs2dKsfn6Oz1dffaVevXqpcePGioiI0Pnz5xUcHKz77rvvjo7R0aNHZWdnp4oVKxb4vC5ZskT//POPhg8fLkdHR1WuXFk///yzOnTooDJlymj48OHy8vLSkSNH9MUXX+idd96RJCUlJemhhx4yJQ7d3Nz05ZdfaujQoUpJScl2C97UqVNla2urUaNGKTk5WdOnT9ezzz6rH374QdKNJRySk5P1559/avbs2ZKk8uXLF+g4vPPOOxo/frz69Omj559/XmfPntX777+vRx55RPv27VPFihXzNU4HTAwAFjFixAgjt0tu8ODBRq1atUzPjx07Zkgy3NzcjIsXL5rKw8LCDElGixYtjGvXrpnK+/XrZzg4OBj//POPYRiGcenSJaNixYrGsGHDzPaTmJhouLq6Ziu/VWRkpCHJ2L59u1n5mTNnDAcHB6Nbt25GRkaGqXzevHmGJGPx4sV5bnfJkiWGpBwfN/d7yZIlZsdGkjFmzBizbe3bt8+QZERGRua5z3LlyhmDBw/Os05Obj0GBem7n5+f0aRJE8MwDOO///2vUaZMGWPYsGFm7bp06WI0a9bMdM4MwzAyMzONdu3aGfXr1zeVZR0zf39/IzMz01T++uuvG3Z2dmY/HzkZMGCAUaVKlQL1tbD1atWqleO5DQ8Pz7F+kyZNDD8/vzz3OXz4cKNs2bJ51gEAWEbWe9KPP/5ozJs3z6hQoYJx5coVwzAMo3fv3kanTp0Mw7jxftCjRw9Tu2+//daQZKxYscJse1u2bMlWnrW9m73wwguGs7Oz2Xumn5+fIclYvny5qSwtLc3w8PAwevXqle8+nT17Ntt7VcuWLY1q1aoZ58+fN5X99NNPhq2trTFo0CBTWXh4uCHJOHv2rPH7778bNWrUMB588EHjwoULpjqTJ082ypUrZ/zxxx9m+x0zZoxhZ2dnJCQkGIbxf2OgKlWqmLXfsGGDIcn44osv8t2nd99915BkHDt2LNtrWTHfTJLh6OhoVv+jjz4yJBkeHh5GSkqKqTxrLJpVNzMz06hfv74REBBgNk65cuWKUbt2baNr1655xnr9+nUjLS3NrOzvv/823N3djeeee85UVpDj07JlS6N69epmY6SvvvrKkGQ23s6Nn5+f0bBhQ+Ps2bOmc/vqq68akoyePXsahlHw8+ri4mKcOXPGrO4jjzxiVKhQwThx4oRZ+c3HcejQoUb16tWNc+fOmdV55plnDFdXV9P1sn37dkOS0ahRI7PjOXfuXEOS8csvv5jKevTokeNxyGkcfuvPy/Hjxw07OzvjnXfeMWv7yy+/GPb29qby/I7TAcMwDG7fA0qw3r17m32S4OPjI+nG2jw3rwfg4+Oj9PR0nTp1SpIUFRWlixcvql+/fjp37pzpYWdnJx8fn2xTovNr27ZtSk9P12uvvSZb2//79TFs2DC5uLho06ZN+drO/PnzFRUVZfa4nZdeesnsedZx2bp1q65cuVKAXhROYfq+atUq9e3bVy+88II++ugjU7sLFy7o66+/Vp8+fXTp0iXT+Tl//rwCAgJ06NAh07nMMnz4cLPp9h06dFBGRoZOnDiRZ9znz59XpUqV7qTrBeLj45Pt3A4aNKjQ26tUqZKuXr1qkXMMAMi/Pn366OrVq9q4caMuXbqkjRs35nrrXmRkpFxdXdW1a1ezcYm3t7fKly9vNi4pW7as6f9Z75EdOnTQlStXdODAAbPtli9f3mzdHwcHB7Vt21ZHjx4tdL9Onz6t+Ph4DRkyRJUrVzaVN2/eXF27dtXmzZuztdm/f7/8/Pzk5eWlbdu2mb3vRkZGqkOHDqpUqZJZ3/39/ZWRkaEdO3aYbatv375m7Tt06CBJd9Sn/OjSpYvZDLCsMWevXr1UoUKFbOVZ8cTHx+vQoUPq37+/zp8/b+pfamqqunTpoh07duT5ZT52dnamtZUyMzN14cIFXb9+XW3atFFcXFy2+rc7Plnnb/DgwWZj6K5du6px48b5Ph4HDhyQm5ub3Nzc1KhRI73//vvq0aOH6a6Egp7XXr16yc3NzfT87Nmz2rFjh5577jndf//9ZnWzxnuGYei///2vevbsKcMwzPYTEBCg5OTkbMcoODjYbK2qov75WbdunTIzM9WnTx+zeDw8PFS/fn3TtWzpcTpKN27fA0qwW9+ksn7Be3p65lietS7DoUOHJCnXxaFdXFwKFU9WAqRBgwZm5Q4ODqpTp85tEyRZ2rZtm+tC5zmxt7fPNuW6du3aCg0N1axZs7RixQp16NBBjz/+uAYMGFAsU4IL2vdjx45pwIAB6t27t95//32z1w4fPizDMDR+/HiNHz8+x/2dOXNGNWvWND2/9Wcha0B261ocOTEM47Z1ikrVqlWLdP2qrNj59j0AKFnc3Nzk7++vlStX6sqVK8rIyNDTTz+dY91Dhw4pOTlZ1apVy/H1M2fOmP7/66+/aty4cfr666+VkpJiVu/WtWjuu+++bO8PlSpV0s8//1yYLknK/f1eurGUwdatW7N94UrPnj3l7u6urVu3ZrsV6tChQ/r555/NEhI3u7nv0p2939+JOx1zDh48ONdtJycn5/kB2bJlyzRz5kwdOHBA165dM5Xf+k3NOcV56/HJOn/169fP1rZBgwY5Jrpy4uXlpUWLFpkW/65fv77Zz29Bz+utfclKEjVt2jTXGM6ePauLFy9q4cKFWrhwYb72U9w/P4cOHZJhGDkeX0mmWygtPU5H6UZSCijB7OzsClSe9Qd81idSn376qTw8PLLVK23fuuLo6Gg2OynLzJkzNWTIEG3YsEFfffWVXn31VUVEROj777+/43UD7lT16tVVvXp1bd68WXv27DFLwmWdn1GjRikgICDH9jd/XbV0+3OemypVqhT7QLY4/f3333J2djb75BwAUDL0799fw4YNU2Jiorp3766KFSvmWC8zM1PVqlXTihUrcnw96w/7ixcvys/PTy4uLnrrrbdUt25dOTk5KS4uTm+++Wa2GTeFfW8sar169dKyZcu0YsUKvfDCC2avZWZmqmvXrnrjjTdybPvAAw+YPbdWn+50zPnuu+9mW/8pS15rFn322WcaMmSIgoKCNHr0aFWrVk12dnaKiIjQkSNHChxPUSlXrlyeH7IV9LwWZhyTdWwHDBiQa9Lv5m+SlIr/+GRmZsrGxkZffvlljvu6+VyX5HE6SpbS9ZcpgHzJWsy7WrVqhZq1ktuslFq1akmSDh48qDp16pjK09PTdezYMat8w1uzZs3UrFkzjRs3Trt27dLDDz+sBQsW6O2335ZUdDNsCtp3Jycnbdy4UZ07d1ZgYKC++eYbNWnSRJJM7cuUKVPsx6xhw4ZasWKFkpOTS+UnU8eOHTMtsg8AKFmefPJJvfDCC/r+++/z/OKNunXratu2bXr44Yfz/OM8JiZG58+f17p16/TII4+Yyo8dO1akcefl5vf7Wx04cEBVq1Y1myUl3UjI2Nvb6+WXX1aFChXMbmOsW7euLl++XCq/BTc/ssacLi4uherj2rVrVadOHa1bt85szBYeHl6oeLLOX9YMrpvldE4L607Pa9ZYcP/+/bnWcXNzU4UKFZSRkVGkPz93MjauW7euDMNQ7dq1syXecnK7cTogSawpBdyFAgIC5OLioilTpphNg86S9VW2uckabF28eNGs3N/fXw4ODnrvvffMPnH55JNPlJycrB49etx58PmUkpKi69evm5U1a9ZMtra2SktLM5WVK1cuWz8KozB9d3V11datW1WtWjV17drV9IlftWrV1LFjR3300Uc6ffp0tna3Oz8F4evrK8MwtHfv3iLbpiXFxcWpXbt21g4DAJCD8uXL68MPP9TEiRPVs2fPXOv16dNHGRkZmjx5crbXrl+/bnqfzpp5cfP7bHp6uj744IOiDTwP1atXV8uWLbVs2TKz8cP+/fv11Vdf6dFHH83WxsbGRgsXLtTTTz+twYMH6/PPPze91qdPH8XGxmrr1q3Z2l28eDHbWKa08fb2Vt26dTVjxgxdvnw52+u3G9PkdM5/+OEHxcbGFiqem8/fzbd7RkVF6bfffivUNnNyp+fVzc1NjzzyiBYvXqyEhASz17KOhZ2dnXr16qX//ve/OSavCjteLFeuXLZbYfPrqaeekp2dnSZNmpRt9pVhGDp//ryk/I/TAYmZUsBdycXFRR9++KEGDhyo1q1b65lnnpGbm5sSEhK0adMmPfzww5o3b16u7Vu2bCk7OztNmzZNycnJcnR0VOfOnVWtWjWFhYVp0qRJCgwM1OOPP66DBw/qgw8+0IMPPmi22Ghx+/rrrxUSEqLevXvrgQce0PXr1/Xpp5+a3sCzeHt7a9u2bZo1a5Zq1Kih2rVrmxbpLAg3N7dC9b1q1aqKiopS+/bt5e/vr507d6pmzZqaP3++2rdvr2bNmmnYsGGqU6eOkpKSFBsbqz///FM//fRToY/Nzdq3b68qVapo27Ztua4xVlLt3btXFy5c0BNPPGHtUAAAuchrLaEsfn5+euGFFxQREaH4+Hh169ZNZcqU0aFDhxQZGam5c+fq6aefVrt27VSpUiUNHjxYr776qmxsbPTpp59a/Ha8d999V927d5evr6+GDh2qq1ev6v3335erq6smTpyYYxtbW1t99tlnCgoKUp8+fbR582Z17txZo0eP1ueff67HHntMQ4YMkbe3t1JTU/XLL79o7dq1On78uKpWrWrR/hUlW1tbffzxx+revbuaNGmi4OBg1axZU6dOndL27dvl4uKiL774Itf2jz32mNatW6cnn3xSPXr00LFjx7RgwQI1btw4xyRXfkRERKhHjx5q3769nnvuOV24cEHvv/++mjRpUuht3qoozut7772n9u3bq3Xr1ho+fLhq166t48ePa9OmTYqPj5ckTZ06Vdu3b5ePj4+GDRumxo0b68KFC4qLi9O2bdt04cKFAsfu7e2tNWvWKDQ0VA8++KDKly+fZ1L5ZnXr1tXbb7+tsLAwHT9+XEFBQapQoYKOHTum//3vfxo+fLhGjRqV73E6IJGUAu5a/fv3V40aNTR16lS9++67SktLU82aNdWhQwcFBwfn2dbDw0MLFixQRESEhg4dqoyMDG3fvl3VqlXTxIkT5ebmpnnz5un1119X5cqVNXz4cE2ZMsW0uKEltGjRQgEBAfriiy906tQpOTs7q0WLFvryyy/10EMPmerNmjVLw4cP17hx43T16lUNHjy4UEkpSYXue82aNbVt2zZ16NBBXbt21Y4dO9S4cWPt2bNHkyZN0tKlS3X+/HlVq1ZNrVq10oQJEwoVX04cHBz07LPPKjIyUlOmTCmy7VpCZGSk7r///lKXTAMAZLdgwQJ5e3vro48+0tixY2Vvby8vLy8NGDBADz/8sKQb6yBu3LhR//rXvzRu3DhVqlRJAwYMUJcuXXJdg7E4+Pv7a8uWLQoPD9eECRNUpkwZ+fn5adq0aTkuvp2lTJkyWrt2rbp3764nnnhC27Ztk4+Pj7755htNmTJFkZGRWr58uVxcXPTAAw9o0qRJpfLW+lt17NhRsbGxmjx5subNm6fLly/Lw8NDPj4+2dbYutWQIUOUmJiojz76SFu3blXjxo312WefKTIyUjExMYWKJzAwUJGRkRo3bpzCwsJUt25dLVmyRBs2bCj0Nm/l7Ox8x+e1RYsW+v777zV+/Hh9+OGH+ueff1SrVi316dPHVMfd3V27d+/WW2+9pXXr1umDDz5QlSpV1KRJE02bNq1Qsb/88suKj4/XkiVLNHv2bNWqVSvfSSlJGjNmjB544AHNnj1bkyZNknRjQfxu3brp8ccfN/UtP+N0QJJsDEt/9AAAsKijR4+qYcOG+vLLL9WlSxdrh5MvaWlp8vLy0pgxYzRy5EhrhwMAAACgGLCmFADc5erUqaOhQ4dq6tSp1g4l35YsWaIyZcroxRdftHYoAAAAAIoJM6UAAAAAAABgccyUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMXZWzsAS8vMzNRff/2lChUqyMbGxtrhAACAEsQwDF26dEk1atSQrS2f3eWFMRUAAMhNfsdU91xS6q+//pKnp6e1wwAAACXYyZMndd9991k7jBKNMRUAALid242p7rmkVIUKFSTdODAuLi5WjgYAAJQkKSkp8vT0NI0XkDvGVAAAIDf5HVPdc0mprOnlLi4uDKAAAECOuB3t9hhTAQCA27ndmMqqiyXs2LFDPXv2VI0aNWRjY6P169fnu+13330ne3t7tWzZstjiAwAAAAAAQPGwalIqNTVVLVq00Pz58wvU7uLFixo0aJC6dOlSTJEBAAAAAACgOFn19r3u3bure/fuBW734osvqn///rKzsyvQ7CoAAAAAAACUDKVuTaklS5bo6NGj+uyzz/T222/ftn5aWprS0tJMz1NSUoozPAAAJEkZGRm6du2atcPALcqUKSM7Oztrh3FP4VoombgWAAAlQalKSh06dEhjxozRt99+K3v7/IUeERGhSZMmFXNkAADcYBiGEhMTdfHiRWuHglxUrFhRHh4eLGZezLgWSj6uBQCAtZWapFRGRob69++vSZMm6YEHHsh3u7CwMIWGhpqeZ30tIQAAxSHrj/Bq1arJ2dmZP/ZKEMMwdOXKFZ05c0aSVL16dStHdHfjWii5uBYAACVFqUlKXbp0SXv27NG+ffsUEhIiScrMzJRhGLK3t9dXX32lzp07Z2vn6OgoR0dHS4cLALgHZWRkmP4Ir1KlirXDQQ7Kli0rSTpz5oyqVavG7UvFhGuh5ONaAACUBKUmKeXi4qJffvnFrOyDDz7Q119/rbVr16p27dpWigwAgBuy1s1xdna2ciTIS9b5uXbtGn+IFxOuhdKBawEAYG1WTUpdvnxZhw8fNj0/duyY4uPjVblyZd1///0KCwvTqVOntHz5ctna2qpp06Zm7atVqyYnJ6ds5QAAWBO3KZVsnB/L4ViXbJwfAIC1WTUptWfPHnXq1Mn0PGvtp8GDB2vp0qU6ffq0EhISrBUeAAAAAAAAiomtNXfesWNHGYaR7bF06VJJ0tKlSxUTE5Nr+4kTJyo+Pt4isQIAgOK1dOlSVaxY0dphAFbHtQAAuFeUmjWlAAAozbzGbLLo/o5P7VGg+kOGDNGyZcskSfb29rrvvvvUu3dvvfXWW3JyciqOEG9r4sSJWr9+/W0/gPr11181YcIE7d27VydOnNDs2bP12muvWSRGFJwlr4WCXgcS1wIAAJZk1ZlSAACg5AgMDNTp06d19OhRzZ49Wx999JHCw8OtHdZtXblyRXXq1NHUqVPl4eFh7XCKzfz58+Xl5SUnJyf5+Pho9+7dedaPjIxUw4YN5eTkpGbNmmnz5s1mrw8ZMkQ2NjZmj8DAwOLsQqnBtQAAgGUwU6oYWPrTcAB3pjCfpAN3I0dHR9Mfsp6envL391dUVJSmTZsmScrMzNS0adO0cOFCJSYm6oEHHtD48eP19NNPS5L+/vtvhYSE6KuvvtLly5d13333aezYsQoODlZMTIw6deqkv//+23RbUnx8vFq1aqVjx47Jy8vLLJalS5dq0qRJkv5vMeYlS5ZoyJAh2eJ+8MEH9eCDD0qSxowZU9SHpURYs2aNQkNDtWDBAvn4+GjOnDkKCAjQwYMHVa1atWz1d+3apX79+ikiIkKPPfaYVq5cqaCgIMXFxZl9QUxgYKCWLFlieu7o6GiR/pR0XAuA9ZXGv6kYUxat0vYzwPkvHJJSAAAgm/3792vXrl2qVauWqSwiIkKfffaZFixYoPr162vHjh0aMGCA3Nzc5Ofnp/Hjx+u3337Tl19+qapVq+rw4cO6evVqofbft29f7d+/X1u2bNG2bdskSa6urkXSt9Jo1qxZGjZsmIKDgyVJCxYs0KZNm7R48eIckw9z585VYGCgRo8eLUmaPHmyoqKiNG/ePC1YsMBU7+bkC3LGtQAAQPEhKQUAACRJGzduVPny5XX9+nWlpaXJ1tZW8+bNkySlpaVpypQp2rZtm3x9fSVJderU0c6dO/XRRx/Jz89PCQkJatWqldq0aSNJ2WZ8FETZsmVVvnx52dvb3/NJk/T0dO3du1dhYWGmMltbW/n7+ys2NjbHNrGxsaZvNc4SEBCg9evXm5XFxMSoWrVqqlSpkjp37qy3335bVapUKfI+lDZcCwAAWAZJKQAAIEnq1KmTPvzwQ6Wmpmr27Nmyt7dXr169JEmHDx/WlStX1LVrV7M26enpatWqlSTppZdeUq9evRQXF6du3bopKChI7dq1s3g/7jbnzp1TRkaG3N3dzcrd3d114MCBHNskJibmWD8xMdH0PDAwUE899ZRq166tI0eOaOzYserevbtiY2NlZ2eXbZtpaWlKS0szPU9JSbmTbpVoXAsAAFgGSSkAACBJKleunOrVqydJWrx4sVq0aKFPPvlEQ4cO1eXLlyVJmzZtUs2aNc3aZa1D1L17d504cUKbN29WVFSUunTpohEjRmjGjBmytb3x3SqGYZjaXbt2zRLdQi6eeeYZ0/+bNWum5s2bq27duoqJiVGXLl2y1Y+IiDCtbXS341oAAMAy+PY9AACQja2trcaOHatx48bp6tWraty4sRwdHZWQkKB69eqZPTw9PU3t3NzcNHjwYH322WeaM2eOFi5caCqXpNOnT5vq3u7r7R0cHJSRkVH0nStlqlatKjs7OyUlJZmVJyUl5Xo7l4eHR4HqSzduQcta/ygnYWFhSk5ONj1OnjxZwJ6UTlwLAAAUH5JSAAAgR71795adnZ3mz5+vChUqaNSoUXr99de1bNkyHTlyRHFxcXr//fe1bNkySdKECRO0YcMGHT58WL/++qs2btyoRo0aSZLpD/aJEyfq0KFD2rRpk2bOnJnn/r28vHTs2DHFx8fr3LlzZreO3Sw9PV3x8fGKj49Xenq6Tp06pfj4+FyTK6WNg4ODvL29FR0dbSrLzMxUdHS0aU2jW/n6+prVl6SoqKhc60vSn3/+qfPnz6t69eo5vu7o6CgXFxezx72CawEAgOJBUgoAAOTI3t5eISEhmj59ulJTUzV58mSNHz9eERERatSokQIDA7Vp0ybVrl1b0o3kSVhYmJo3b65HHnlEdnZ2Wr16tSSpTJkyWrVqlQ4cOKDmzZtr2rRpevvtt/Pcf69evRQYGKhOnTrJzc1Nq1atyrHeX3/9pVatWqlVq1Y6ffq0ZsyYoVatWun5558v2gNiRaGhoVq0aJGWLVum33//XS+99JJSU1NN38Y3aNAgs4XQR44cqS1btmjmzJk6cOCAJk6cqD179igkJESSdPnyZY0ePVrff/+9jh8/rujoaD3xxBOqV6+eAgICrNLHkoxrAQCA4mFj3HxD+z0gJSVFrq6uSk5OLrZP+LzGbCqW7QIoHsen9rB2CLhL/PPPPzp27Jhq164tJycna4eDXOR1niwxTiisefPm6d1331ViYqJatmyp9957Tz4+PpKkjh07ysvLS0uXLjXVj4yM1Lhx43T8+HHVr19f06dP16OPPipJunr1qoKCgrRv3z5dvHhRNWrUULdu3TR58uRsC6TnJq9jxbVQOnCeUJKVxr+pGFMWrdL2M8D5N5ffMRULnQMAAJQCISEhpplOt4qJiclW1rt3b/Xu3TvH+mXLltXWrVuLMjwAAIAC4/Y9AAAAAAAAWBxJKQAAAAAAAFgcSSkAAAAAAABYHEkpAAAAAAAAWBxJKQAAAAAAAFgcSSkAAAAAAABYHEkpAAAAAAAAWBxJKQAAAAAAAFgcSSkAAFAiLF26VBUrVrR2GIDVcS0AAO4V9tYOAACAe8JEVwvvL7lA1YcMGaJly5ZJkuzt7XXfffepd+/eeuutt+Tk5FQcEd7WxIkTtX79esXHx+dZb9GiRVq+fLn2798vSfL29taUKVPUtm1bC0SJArPktVDA60DiWgAAwJKYKQUAACRJgYGBOn36tI4eParZs2fro48+Unh4uLXDuq2YmBj169dP27dvV2xsrDw9PdWtWzedOnXK2qGhlOJaAADAMkhKAQAASZKjo6M8PDzk6empoKAg+fv7KyoqyvR6ZmamIiIiVLt2bZUtW1YtWrTQ2rVrTa///fffevbZZ+Xm5qayZcuqfv36WrJkiaQbfyzb2Njo4sWLpvrx8fGysbHR8ePHs8WydOlSTZo0ST/99JNsbGxkY2OjpUuX5hj3ihUr9PLLL6tly5Zq2LChPv74Y2VmZio6OrpIjgvuPVwLAABYBrfvAQCAbPbv369du3apVq1aprKIiAh99tlnWrBggerXr68dO3ZowIABcnNzk5+fn8aPH6/ffvtNX375papWrarDhw/r6tWrhdp/3759tX//fm3ZskXbtm2TJLm65u+2rytXrujatWuqXLlyofYN3IxrAQCA4kNSCgAASJI2btyo8uXL6/r160pLS5Otra3mzZsnSUpLS9OUKVO0bds2+fr6SpLq1KmjnTt36qOPPpKfn58SEhLUqlUrtWnTRpLk5eVV6FjKli2r8uXLy97eXh4eHgVq++abb6pGjRry9/cv9P5xb+NaAADAMkhKAQAASVKnTp304YcfKjU1VbNnz5a9vb169eolSTp8+LCuXLmirl27mrVJT09Xq1atJEkvvfSSevXqpbi4OHXr1k1BQUFq166dRfswdepUrV69WjExMVZblBqlH9cCAACWQVIKAABIksqVK6d69epJkhYvXqwWLVrok08+0dChQ3X58mVJ0qZNm1SzZk2zdo6OjpKk7t2768SJE9q8ebOioqLUpUsXjRgxQjNmzJCt7Y1lLA3DMLW7du1akcY/Y8YMTZ06Vdu2bVPz5s2LdNu4t3AtAABgGSx0DgAAsrG1tdXYsWM1btw4Xb16VY0bN5ajo6MSEhJUr149s4enp6epnZubmwYPHqzPPvtMc+bM0cKFC03lknT69GlT3dt9vb2Dg4MyMjLyFe/06dM1efJkbdmyxXTLFFAUuBYAACg+JKUAAECOevfuLTs7O82fP18VKlTQqFGj9Prrr2vZsmU6cuSI4uLi9P7772vZsmWSpAkTJmjDhg06fPiwfv31V23cuFGNGjWSJNMf7BMnTtShQ4e0adMmzZw5M8/9e3l56dixY4qPj9e5c+eUlpaWY71p06Zp/PjxWrx4sby8vJSYmKjExETTjBbgTnEtAABQPEhKAQCAHNnb2yskJETTp09XamqqJk+erPHjxysiIkKNGjVSYGCgNm3apNq1a0u6MZsjLCxMzZs31yOPPCI7OzutXr1aklSmTBmtWrVKBw4cUPPmzTVt2jS9/fbbee6/V69eCgwMVKdOneTm5qZVq1blWO/DDz9Uenq6nn76aVWvXt30mDFjRtEeENyzuBYAACgeNsbNN7TfA1JSUuTq6qrk5GS5uLgUyz68xmwqlu0CKB7Hp/awdgi4S/zzzz86duyYateuzcLCJVhe58kS44S7RV7HimuhdOA8oSQrjX9TMaYsWqXtZ4Dzby6/YypmSgEAAAAAAMDiSEoBAAAAAADA4qyalNqxY4d69uypGjVqyMbGRuvXr8+z/rp169S1a1e5ubnJxcVFvr6+2rp1q2WCBQAAAAAAQJGxalIqNTVVLVq00Pz58/NVf8eOHeratas2b96svXv3qlOnTurZs6f27dtXzJECAAAAAACgKNlbc+fdu3dX9+7d811/zpw5Zs+nTJmiDRs26IsvvlCrVq2KODoAAAAAAAAUF6smpe5UZmamLl26pMqVK+daJy0tTWlpaabnKSkplggNAHAPy8zMtHYIyAPnx3I41iUb5wcAYG2lOik1Y8YMXb58WX369Mm1TkREhCZNmmTBqAAA9yoHBwfZ2trqr7/+kpubmxwcHGRjY2PtsPD/GYah9PR0nT17Vra2tnJwcLB2SHctroWSjWsBAFBSlNqk1MqVKzVp0iRt2LBB1apVy7VeWFiYQkNDTc9TUlLk6elpiRABAPcYW1tb1a5dW6dPn9Zff/1l7XCQC2dnZ91///2yteVLiIsL10LpwLUAALC2UpmUWr16tZ5//nlFRkbK398/z7qOjo5ydHS0UGQAgHudg4OD7r//fl2/fl0ZGRnWDge3sLOzk729PbN2LIBroWTjWgAAlASlLim1atUqPffcc1q9erV69Ohh7XAAAMjGxsZGZcqUUZkyZawdCmBVXAsAACAvVk1KXb58WYcPHzY9P3bsmOLj41W5cmXdf//9CgsL06lTp7R8+XJJN27ZGzx4sObOnSsfHx8lJiZKksqWLStXV1er9AEAAAAAAAAFZ9UbyPfs2aNWrVqpVatWkqTQ0FC1atVKEyZMkCSdPn1aCQkJpvoLFy7U9evXNWLECFWvXt30GDlypFXiBwAAAAAAQOFYdaZUx44dZRhGrq8vXbrU7HlMTEzxBgQAAAAAAACL4Ks2AAAAAAAAYHEkpQAAAAAAAGBxJKUAAAAAAABgcSSlAAAAAAAAYHEkpQAAAAAAAGBxJKUAAAAAAABgcSSlAAAAAAAAYHEkpQAAAAAAAGBxJKUAAAAAAABgcSSlAAAAAAAAYHEkpQAAAAAAAGBxJKUAAAAAAABgcSSlAAAAAAAAYHEkpQAAAAAAAGBxJKUAAAAAAABgcSSlAAAAAAAAYHEkpQAAAAAAAGBxJKUAAABKgfnz58vLy0tOTk7y8fHR7t2786wfGRmphg0bysnJSc2aNdPmzZtzrfviiy/KxsZGc+bMKeKoAQAAckdSCgAAoIRbs2aNQkNDFR4erri4OLVo0UIBAQE6c+ZMjvV37dqlfv36aejQodq3b5+CgoIUFBSk/fv3Z6v7v//9T99//71q1KhR3N0AAAAwQ1IKAACghJs1a5aGDRum4OBgNW7cWAsWLJCzs7MWL16cY/25c+cqMDBQo0ePVqNGjTR58mS1bt1a8+bNM6t36tQpvfLKK1qxYoXKlCljia4AAACYkJQCAAAowdLT07V37175+/ubymxtbeXv76/Y2Ngc28TGxprVl6SAgACz+pmZmRo4cKBGjx6tJk2aFE/wAAAAebC3dgAAAADI3blz55SRkSF3d3ezcnd3dx04cCDHNomJiTnWT0xMND2fNm2a7O3t9eqrr+YrjrS0NKWlpZmep6Sk5LcLAAAAOWKmFAAAwD1m7969mjt3rpYuXSobG5t8tYmIiJCrq6vp4enpWcxRAgCAux1JKQAAgBKsatWqsrOzU1JSkll5UlKSPDw8cmzj4eGRZ/1vv/1WZ86c0f333y97e3vZ29vrxIkT+te//iUvL68ctxkWFqbk5GTT4+TJk3feOQAAcE/j9j0AmOhq7QgAFMTEZGtHYFEODg7y9vZWdHS0goKCJN1YDyo6OlohISE5tvH19VV0dLRee+01U1lUVJR8fX0lSQMHDsxxzamBAwcqODg4x206OjrK0dHxzjsEAADw/5GUAgAAKOFCQ0M1ePBgtWnTRm3bttWcOXOUmppqSiANGjRINWvWVEREhCRp5MiR8vPz08yZM9WjRw+tXr1ae/bs0cKFCyVJVapUUZUqVcz2UaZMGXl4eKhBgwaW7RwAALhnkZQCAAAo4fr27auzZ89qwoQJSkxMVMuWLbVlyxbTYuYJCQmytf2/VRnatWunlStXaty4cRo7dqzq16+v9evXq2nTptbqAgAAQDYkpQAAAEqBkJCQXG/Xi4mJyVbWu3dv9e7dO9/bP378eCEjAwAAKBwWOgcAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMVZNSm1Y8cO9ezZUzVq1JCNjY3Wr19/2zYxMTFq3bq1HB0dVa9ePS1durTY4wQAAAAAAEDRsmpSKjU1VS1atND8+fPzVf/YsWPq0aOHOnXqpPj4eL322mt6/vnntXXr1mKOFAAAAAAAAEXJ3po77969u7p3757v+gsWLFDt2rU1c+ZMSVKjRo20c+dOzZ49WwEBAcUVJgAAAAAAAIpYqVpTKjY2Vv7+/mZlAQEBio2NtVJEAAAAAAAAKAyrzpQqqMTERLm7u5uVubu7KyUlRVevXlXZsmWztUlLS1NaWprpeUpKSrHHCQAAAAAAgLyVqplShRERESFXV1fTw9PT09ohAQAAAAAA3PNKVVLKw8NDSUlJZmVJSUlycXHJcZaUJIWFhSk5Odn0OHnypCVCBQAAAAAAQB5K1e17vr6+2rx5s1lZVFSUfH19c23j6OgoR0fH4g4NAAAAAAAABWDVmVKXL19WfHy84uPjJUnHjh1TfHy8EhISJN2Y5TRo0CBT/RdffFFHjx7VG2+8oQMHDuiDDz7Qf/7zH73++uvWCB8AAAAAAACFZNWk1J49e9SqVSu1atVKkhQaGqpWrVppwoQJkqTTp0+bElSSVLt2bW3atElRUVFq0aKFZs6cqY8//lgBAQFWiR8AAAAAAACFY9Xb9zp27CjDMHJ9fenSpTm22bdvXzFGBQAAAAAAgOJWqhY6BwAAAAAAwN2BpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyuUEmpq1ev6sqVK6bnJ06c0Jw5c/TVV18VWWAAAAClGeMlAACAvBUqKfXEE09o+fLlkqSLFy/Kx8dHM2fO1BNPPKEPP/ywSAMEAAAojRgvAQAA5K1QSam4uDh16NBBkrR27Vq5u7vrxIkTWr58ud57770iDRAAAKA0Kurx0vz58+Xl5SUnJyf5+Pho9+7dedaPjIxUw4YN5eTkpGbNmmnz5s1mr0+cOFENGzZUuXLlVKlSJfn7++uHH34ocFwAAACFVaik1JUrV1ShQgVJ0ldffaWnnnpKtra2euihh3TixIkCbaugA6w5c+aoQYMGKlu2rDw9PfX666/rn3/+KUw3AAAAik1RjpfWrFmj0NBQhYeHKy4uTi1atFBAQIDOnDmTY/1du3apX79+Gjp0qPbt26egoCAFBQVp//79pjoPPPCA5s2bp19++UU7d+6Ul5eXunXrprNnzxa+0wAAAAVQqKRUvXr1tH79ep08eVJbt25Vt27dJElnzpyRi4tLvrdT0AHWypUrNWbMGIWHh+v333/XJ598ojVr1mjs2LGF6QYAAECxKarxkiTNmjVLw4YNU3BwsBo3bqwFCxbI2dlZixcvzrH+3LlzFRgYqNGjR6tRo0aaPHmyWrdurXnz5pnq9O/fX/7+/qpTp46aNGmiWbNmKSUlRT///HPhOw0AAFAAhUpKTZgwQaNGjZKXl5d8fHzk6+sr6cangK1atcr3dgo6wNq1a5cefvhh9e/f3/RpXr9+/W47uwoAAMDSimq8lJ6err1798rf399UZmtrK39/f8XGxubYJjY21qy+JAUEBORaPz09XQsXLpSrq6tatGiR79gAAADuRKGSUk8//bQSEhK0Z88ebdmyxVTepUsXzZ49O1/bKMwAq127dtq7d68pCXX06FFt3rxZjz76aGG6AQAAUGyKYrwkSefOnVNGRobc3d3Nyt3d3ZWYmJhjm8TExHzV37hxo8qXLy8nJyfNnj1bUVFRqlq1ao7bTEtLU0pKitkDAADgTtgXtqGHh4c8PDzMytq2bZvv9nkNsA4cOJBjm/79++vcuXNq3769DMPQ9evX9eKLL+Z5+15aWprS0tJMzxlAAQAAS7nT8VJx69Spk+Lj43Xu3DktWrRIffr00Q8//KBq1aplqxsREaFJkyZZIUoAAHC3yndS6qmnnsr3RtetW1eoYG4nJiZGU6ZM0QcffCAfHx8dPnxYI0eO1OTJkzV+/Pgc2zCAAgAAllIc46WqVavKzs5OSUlJZuVJSUnZEl5ZPDw88lW/XLlyqlevnurVq6eHHnpI9evX1yeffKKwsLBs2wwLC1NoaKjpeUpKijw9PfPVBwAAgJzk+/Y9V1dX08PFxUXR0dHas2eP6fW9e/cqOjparq6u+dpeYQZY48eP18CBA/X888+rWbNmevLJJzVlyhRFREQoMzMzxzZhYWFKTk42PU6ePJnPHgMAABRMUY+XJMnBwUHe3t6Kjo42lWVmZio6Otq0TtWtfH19zepLUlRUVK71b97uzTPMb+bo6CgXFxezBwAAwJ3I90ypJUuWmP7/5ptvqk+fPlqwYIHs7OwkSRkZGXr55ZfzPUC5eYAVFBQk6f8GWCEhITm2uXLlimxtzfNoWfs3DCPHNo6OjnJ0dMxXTAAAAHeiqMdLWUJDQzV48GC1adNGbdu21Zw5c5Samqrg4GBJ0qBBg1SzZk1FRERIkkaOHCk/Pz/NnDlTPXr00OrVq7Vnzx4tXLhQkpSamqp33nlHjz/+uKpXr65z585p/vz5OnXqlHr37l0UhwIAAOC2CrWm1OLFi7Vz507TAEu6kRwKDQ1Vu3bt9O677+ZrOwUdYPXs2VOzZs1Sq1atTLfvjR8/Xj179jSLBQAAwNqKarwkSX379tXZs2c1YcIEJSYmqmXLltqyZYtpbc6EhASzD+7atWunlStXaty4cRo7dqzq16+v9evXq2nTpqY4Dhw4oGXLluncuXOqUqWKHnzwQX377bdq0qRJER0BAACAvBUqKXX9+nUdOHBADRo0MCs/cOBArrfR5aSgA6xx48bJxsZG48aN06lTp+Tm5qaePXvqnXfeKUw3AAAAik1RjZeyhISE5DqbPCYmJltZ7969c5315OTkVGxrgAIAAORXoZJSwcHBGjp0qI4cOWL6BpkffvhBU6dONc1yyq+CDLDs7e0VHh6u8PDwwoQNAABgMUU5XgIAALgbFSopNWPGDHl4eGjmzJk6ffq0JKl69eoaPXq0/vWvfxVpgAAAAKUR4yUAAIC8FSopZWtrqzfeeENvvPGGUlJSJIlvYAEAALgJ4yUAAIC8FSopdTMGVwAAAHljvAQAAJCd7e2rZJeUlKSBAweqRo0asre3l52dndkDAADgXsd4CQAAIG+Fmik1ZMgQJSQkaPz48apevbpsbGyKOi4AAIBSjfESAABA3gqVlNq5c6e+/fZbtWzZsojDAQAAuDswXgIAAMhboW7f8/T0lGEYRR0LAADAXYPxEgAAQN4KlZSaM2eOxowZo+PHjxdxOAAAAHcHxksAAAB5K9Tte3379tWVK1dUt25dOTs7q0yZMmavX7hwoUiCAwAAKK0YLwEAAOStUEmpOXPmFHEYAAAAdxfGS3fOa8wma4dQYMen9rB2CAAAlBqFSkoNHjy4qOMAAAC4qzBeAgAAyFuhklKSlJGRofXr1+v333+XJDVp0kSPP/647Ozsiiw4AACA0ozxEgAAQO4KlZQ6fPiwHn30UZ06dUoNGjSQJEVERMjT01ObNm1S3bp1izRIAACA0obxEgAAQN4K9e17r776qurWrauTJ08qLi5OcXFxSkhIUO3atfXqq68WdYwAAAClDuMlAACAvBVqptQ333yj77//XpUrVzaVValSRVOnTtXDDz9cZMEBAACUVoyXAAAA8laomVKOjo66dOlStvLLly/LwcHhjoMCAAAo7RgvAQAA5K1QSanHHntMw4cP1w8//CDDMGQYhr7//nu9+OKLevzxx4s6RgAAgFKH8RIAAEDeCpWUeu+991S3bl35+vrKyclJTk5Oevjhh1WvXj3NnTu3qGMEAAAodRgvAQAA5K1Qa0pVrFhRGzZs0OHDh01fcdyoUSPVq1evSIMDAAAorRgvAQAA5K1QSaks9erVY2AFAACQB8ZLAAAAOSvU7Xu9evXStGnTspVPnz5dvXv3vuOgAAAASjvGSwAAAHkrVFJqx44devTRR7OVd+/eXTt27LjjoAAAAEo7xksAAAB5K1RSKrevMi5TpoxSUlLuOCgAAIDSjvESAABA3gqVlGrWrJnWrFmTrXz16tVq3LjxHQcFAABQ2jFeAgAAyFuhFjofP368nnrqKR05ckSdO3eWJEVHR2vVqlWKjIws0gABAABKI8ZLAAAAeStUUqpnz55av369pkyZorVr16ps2bJq3ry5tm3bJj8/v6KOEQAAoNRhvAQAAJC3QiWlJKlHjx7q0aNHUcYCAABwV2G8BAAAkLtCrSklSRcvXtTHH3+ssWPH6sKFC5KkuLg4nTp1qsiCAwAAKM0YLwEAAOSuUDOlfv75Z/n7+8vV1VXHjx/X888/r8qVK2vdunVKSEjQ8uXLizpOAACAUoXxEgAAQN4KNVMqNDRUQ4YM0aFDh+Tk5GQqf/TRR7Vjx44iCw4AAKC0YrwEAACQt0IlpX788Ue98MIL2cpr1qypxMTEOw4KAACgtGO8BAAAkLdCJaUcHR2VkpKSrfyPP/6Qm5vbHQcFAABQ2jFeAgAAyFuhklKPP/643nrrLV27dk2SZGNjo4SEBL355pvq1atXkQYIAABQGjFeAgAAyFuhklIzZ87U5cuXVa1aNV29elV+fn6qW7euypcvr3feeaeoYwQAACh1GC8BAADkrVDfvufq6qqoqCjt3LlTP//8sy5fvixvb2916dKlqOMDAAAolRgvAQAA5K1AM6ViY2O1ceNG0/P27durXLly+uCDD9SvXz8NHz5caWlpBQpg/vz58vLykpOTk3x8fLR79+4861+8eFEjRoxQ9erV5ejoqAceeECbN28u0D4BAACKS3GMlwAAAO5GBUpKvfXWW/r1119Nz3/55RcNGzZMXbt21ZgxY/TFF18oIiIi39tbs2aNQkNDFR4erri4OLVo0UIBAQE6c+ZMjvXT09PVtWtXHT9+XGvXrtXBgwe1aNEi1axZsyDdAAAAKDZFPV4CAAC4WxUoKRUfH2825Xz16tVq27atFi1apNDQUL333nv6z3/+k+/tzZo1S8OGDVNwcLAaN26sBQsWyNnZWYsXL86x/uLFi3XhwgWtX79eDz/8sLy8vOTn56cWLVoUpBsAAADFpqjHSwAAAHerAiWl/v77b7m7u5uef/PNN+revbvp+YMPPqiTJ0/ma1vp6enau3ev/P39/y8YW1v5+/srNjY2xzaff/65fH19NWLECLm7u6tp06aaMmWKMjIyct1PWlqaUlJSzB4AAADFpSjHSwAAAHezAiWl3N3ddezYMUk3kkpxcXF66KGHTK9funRJZcqUyde2zp07p4yMDLNBW9Y+EhMTc2xz9OhRrV27VhkZGdq8ebPGjx+vmTNn6u233851PxEREXJ1dTU9PD098xUfAABAYRTleAkAAOBuVqCk1KOPPqoxY8bo22+/VVhYmJydndWhQwfT6z///LPq1q1b5EFmyczMVLVq1bRw4UJ5e3urb9+++ve//60FCxbk2iYsLEzJycmmB59MAgCA4mTt8RIAAEBpYV+QypMnT9ZTTz0lPz8/lS9fXsuWLZODg4Pp9cWLF6tbt2752lbVqlVlZ2enpKQks/KkpCR5eHjk2KZ69eoqU6aM7OzsTGWNGjVSYmKi0tPTzWLJ4ujoKEdHx3zFBAAAcKeKcrwEAABwNytQUqpq1arasWOHkpOTVb58ebPkkCRFRkaqfPny+dqWg4ODvL29FR0draCgIEk3ZkJFR0crJCQkxzYPP/ywVq5cqczMTNna3pjk9ccff6h69eo5JqQAAAAsrSjHSwAAAHezAiWlsri6uuZYXrly5QJtJzQ0VIMHD1abNm3Utm1bzZkzR6mpqQoODpYkDRo0SDVr1jR9bfJLL72kefPmaeTIkXrllVd06NAhTZkyRa+++mphugEAAFBsimq8BAAoJSbm/Hu/RJuYbO0I7h6c/0IpVFKqqPTt21dnz57VhAkTlJiYqJYtW2rLli2mxc8TEhJMM6IkydPTU1u3btXrr7+u5s2bq2bNmho5cqTefPNNa3UBAAAAAAAAhWDVpJQkhYSE5Hq7XkxMTLYyX19fff/998UcFQAAAABr8hqzydohFNhxp/7WDqHgSsBMCQD3LqsnpQAAAIC7BrdvAACQb7a3rwIAAAAAAAAULZJSAAAAAAAAsDiSUgAAAKXA/Pnz5eXlJScnJ/n4+Gj37t151o+MjFTDhg3l5OSkZs2aafPmzabXrl27pjfffFPNmjVTuXLlVKNGDQ0aNEh//fVXcXcDAADAhKQUAABACbdmzRqFhoYqPDxccXFxatGihQICAnTmzJkc6+/atUv9+vXT0KFDtW/fPgUFBSkoKEj79++XJF25ckVxcXEaP3684uLitG7dOh08eFCPP/64JbsFAADucSSlAAAASrhZs2Zp2LBhCg4OVuPGjbVgwQI5Oztr8eLFOdafO3euAgMDNXr0aDVq1EiTJ09W69atNW/ePEmSq6uroqKi1KdPHzVo0EAPPfSQ5s2bp7179yohIcGSXQMAAPcwklIAAAAlWHp6uvbu3St/f39Tma2trfz9/RUbG5tjm9jYWLP6khQQEJBrfUlKTk6WjY2NKlasmOPraWlpSklJMXsAAADcCZJSAAAAJdi5c+eUkZEhd3d3s3J3d3clJibm2CYxMbFA9f/55x+9+eab6tevn1xcXHKsExERIVdXV9PD09OzEL0BAAD4PySlAAAA7mHXrl1Tnz59ZBiGPvzww1zrhYWFKTk52fQ4efKkBaMEAAB3I3trBwAAAIDcVa1aVXZ2dkpKSjIrT0pKkoeHR45tPDw88lU/KyF14sQJff3117nOkpIkR0dHOTo6FrIXAAAA2TFTCgAAoARzcHCQt7e3oqOjTWWZmZmKjo6Wr69vjm18fX3N6ktSVFSUWf2shNShQ4e0bds2ValSpXg6AAAAkAtmSgEAAJRwoaGhGjx4sNq0aaO2bdtqzpw5Sk1NVXBwsCRp0KBBqlmzpiIiIiRJI0eOlJ+fn2bOnKkePXpo9erV2rNnjxYuXCjpRkLq6aefVlxcnDZu3KiMjAzTelOVK1eWg4ODdToKAADuKSSlAAAASri+ffvq7NmzmjBhghITE9WyZUtt2bLFtJh5QkKCbG3/bwJ8u3bttHLlSo0bN05jx45V/fr1tX79ejVt2lSSdOrUKX3++eeSpJYtW5rta/v27erYsaNF+gUAAO5tJKUAAABKgZCQEIWEhOT4WkxMTLay3r17q3fv3jnW9/LykmEYRRkeAABAgbGmFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsjqQUAAAAAAAALI6kFAAAAAAAACyOpBQAAAAAAAAsrkQkpebPny8vLy85OTnJx8dHu3fvzle71atXy8bGRkFBQcUbIAAAAAAAAIqU1ZNSa9asUWhoqMLDwxUXF6cWLVooICBAZ86cybPd8ePHNWrUKHXo0MFCkQIAAAAAAKCoWD0pNWvWLA0bNkzBwcFq3LixFixYIGdnZy1evDjXNhkZGXr22Wc1adIk1alTx4LRAgAAAAAAoChYNSmVnp6uvXv3yt/f31Rma2srf39/xcbG5trurbfeUrVq1TR06FBLhAkAAAAAAIAiZm/NnZ87d04ZGRlyd3c3K3d3d9eBAwdybLNz50598sknio+Pz9c+0tLSlJaWZnqekpJS6HgBAAAAAABQNKx++15BXLp0SQMHDtSiRYtUtWrVfLWJiIiQq6ur6eHp6VnMUQIAAAAAAOB2rDpTqmrVqrKzs1NSUpJZeVJSkjw8PLLVP3LkiI4fP66ePXuayjIzMyVJ9vb2OnjwoOrWrWvWJiwsTKGhoabnKSkpJKYAAAAAAACszKpJKQcHB3l7eys6OlpBQUGSbiSZoqOjFRISkq1+w4YN9csvv5iVjRs3TpcuXdLcuXNzTDY5OjrK0dGxWOIHAAAAAABA4Vg1KSVJoaGhGjx4sNq0aaO2bdtqzpw5Sk1NVXBwsCRp0KBBqlmzpiIiIuTk5KSmTZuata9YsaIkZSsHAAAAAABAyWX1pFTfvn119uxZTZgwQYmJiWrZsqW2bNliWvw8ISFBtralaukrAAAAAAAA3IbVk1KSFBISkuPtepIUExOTZ9ulS5cWfUAAAAAAAAAoVkxBAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAAAAAAIDFkZQCAAAAAACAxZGUAgAAAAAAgMWRlAIAACgF5s+fLy8vLzk5OcnHx0e7d+/Os35kZKQaNmwoJycnNWvWTJs3bzZ7fd26derWrZuqVKkiGxsbxcfHF2P0AAAA2ZGUAgAAKOHWrFmj0NBQhYeHKy4uTi1atFBAQIDOnDmTY/1du3apX79+Gjp0qPbt26egoCAFBQVp//79pjqpqalq3769pk2bZqluAAAAmCEpBQAAUMLNmjVLw4YNU3BwsBo3bqwFCxbI2dlZixcvzrH+3LlzFRgYqNGjR6tRo0aaPHmyWrdurXnz5pnqDBw4UBMmTJC/v7+lugEAAGCGpBQAAEAJlp6err1795olj2xtbeXv76/Y2Ngc28TGxmZLNgUEBORaPz/S0tKUkpJi9gAAALgTJKUAAABKsHPnzikjI0Pu7u5m5e7u7kpMTMyxTWJiYoHq50dERIRcXV1ND09Pz0JvCwAAQCIpBQAAgHwICwtTcnKy6XHy5ElrhwQAAEo5e2sHAAAAgNxVrVpVdnZ2SkpKMitPSkqSh4dHjm08PDwKVD8/HB0d5ejoWOj2AAAAt2KmFAAAQAnm4OAgb29vRUdHm8oyMzMVHR0tX1/fHNv4+vqa1ZekqKioXOsDAABYAzOlAAAASrjQ0FANHjxYbdq0Udu2bTVnzhylpqYqODhYkjRo0CDVrFlTERERkqSRI0fKz89PM2fOVI8ePbR69Wrt2bNHCxcuNG3zwoULSkhI0F9//SVJOnjwoKQbs6zuZEYVAABAfpGUAgAAKOH69u2rs2fPasKECUpMTFTLli21ZcsW02LmCQkJsrX9vwnw7dq108qVKzVu3DiNHTtW9evX1/r169W0aVNTnc8//9yU1JKkZ555RpIUHh6uiRMnWqZjAADgnkZSCgAAoBQICQlRSEhIjq/FxMRkK+vdu7d69+6d6/aGDBmiIUOGFFF0AAAABceaUgAAAAAAALA4klIAAAAAAACwOJJSAAAAAAAAsDiSUgAAAAAAALC4EpGUmj9/vry8vOTk5CQfHx/t3r0717qLFi1Shw4dVKlSJVWqVEn+/v551gcAAAAAAEDJY/Wk1Jo1axQaGqrw8HDFxcWpRYsWCggI0JkzZ3KsHxMTo379+mn79u2KjY2Vp6enunXrplOnTlk4cgAAAAAAABSW1ZNSs2bN0rBhwxQcHKzGjRtrwYIFcnZ21uLFi3Osv2LFCr388stq2bKlGjZsqI8//liZmZmKjo62cOQAAAAAAAAoLKsmpdLT07V37175+/ubymxtbeXv76/Y2Nh8bePKlSu6du2aKleuXFxhAgAAAAAAoIjZW3Pn586dU0ZGhtzd3c3K3d3ddeDAgXxt480331SNGjXMEls3S0tLU1pamul5SkpK4QMGAAAAAABAkbD67Xt3YurUqVq9erX+97//ycnJKcc6ERERcnV1NT08PT0tHCUAAAAAAABuZdWkVNWqVWVnZ6ekpCSz8qSkJHl4eOTZdsaMGZo6daq++uorNW/ePNd6YWFhSk5ONj1OnjxZJLEDAAAAAACg8KyalHJwcJC3t7fZIuVZi5b7+vrm2m769OmaPHmytmzZojZt2uS5D0dHR7m4uJg9AAAAAAAAYF1WXVNKkkJDQzV48GC1adNGbdu21Zw5c5Samqrg4GBJ0qBBg1SzZk1FRERIkqZNm6YJEyZo5cqV8vLyUmJioiSpfPnyKl++vNX6AQAAAAAAgPyzelKqb9++Onv2rCZMmKDExES1bNlSW7ZsMS1+npCQIFvb/5vQ9eGHHyo9PV1PP/202XbCw8M1ceJES4YOAAAAAACAQrJ6UkqSQkJCFBISkuNrMTExZs+PHz9e/AEBAAAAAACgWJXqb98DAAAAAABA6URSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZXIpJS8+fPl5eXl5ycnOTj46Pdu3fnWT8yMlINGzaUk5OTmjVrps2bN1soUgAAAOso6vGSYRiaMGGCqlevrrJly8rf31+HDh0qzi4AAACYsXpSas2aNQoNDVV4eLji4uLUokULBQQE6MyZMznW37Vrl/r166ehQ4dq3759CgoKUlBQkPbv32/hyAEAACyjOMZL06dP13vvvacFCxbohx9+ULly5RQQEKB//vnHUt0CAAD3OKsnpWbNmqVhw4YpODhYjRs31oIFC+Ts7KzFixfnWH/u3LkKDAzU6NGj1ahRI02ePFmtW7fWvHnzLBw5AACAZRT1eMkwDM2ZM0fjxo3TE088oebNm2v58uX666+/tH79egv2DAAA3Mvsrbnz9PR07d27V2FhYaYyW1tb+fv7KzY2Nsc2sbGxCg0NNSsLCAjIdQCVlpamtLQ00/Pk5GRJUkpKyh1Gn7vMtCvFtm0ARS/FxrB2CAAKohjfw7PGB4ZRcn4vFMd46dixY0pMTJS/v7/pdVdXV/n4+Cg2NlbPPPNMtm0ypsqfUvmeUozn8E5w/i2E819kOP9Fq7T9DHD+b910/sZUVk1KnTt3ThkZGXJ3dzcrd3d314EDB3Jsk5iYmGP9xMTEHOtHRERo0qRJ2co9PT0LGTWAu42rtQMAUDBTi/+qvXTpklxdS8Zvh+IYL2X9y5iq6JWMn5oCssA1da8olUeS819kSuWR5PwXmVJ5JEvAmMqqSSlLCAsLM/ukMDMzUxcuXFCVKlVkY2NjxcgAlAQpKSny9PTUyZMn5eLiYu1wAFiZYRi6dOmSatSoYe1QShzGVLfHe8q9jfN/b+P839s4/9nld0xl1aRU1apVZWdnp6SkJLPypKQkeXh45NjGw8OjQPUdHR3l6OhoVlaxYsXCBw3gruTi4sIbCABJKjEzpLIUx3gp69+kpCRVr17drE7Lli1z3CZjqvzjPeXexvm/t3H+722cf3P5GVNZdaFzBwcHeXt7Kzo62lSWmZmp6Oho+fr65tjG19fXrL4kRUVF5VofAACgNCuO8VLt2rXl4eFhViclJUU//PADYyoAAGAxVr99LzQ0VIMHD1abNm3Utm1bzZkzR6mpqQoODpYkDRo0SDVr1lRERIQkaeTIkfLz89PMmTPVo0cPrV69Wnv27NHChQut2Q0AAIBiU9TjJRsbG7322mt6++23Vb9+fdWuXVvjx49XjRo1FBQUZK1uAgCAe4zVk1J9+/bV2bNnNWHCBCUmJqply5basmWLaeHNhIQE2dr+34Sudu3aaeXKlRo3bpzGjh2r+vXra/369WratKm1ugCgFHN0dFR4eHi2W1IAoCQpjvHSG2+8odTUVA0fPlwXL15U+/bttWXLFjk5OVm8f3cL3lPubZz/exvn/97G+S88G6MkfecxAAAAAAAA7glWXVMKAAAAAAAA9yaSUgAAAAAAALA4klIAAAAAAACwOJJSAEoNwzA0fPhwVa5cWTY2NoqPj7d2SAAASJKWLl2qihUrWjuMbGxsbLR+/XprhwEAQI5ISgGwuo4dO+q1114zPY+JiZGNjY0uXrxoVm/Lli1aunSpNm7cqNOnT6tp06YMtgEARaqkJpduZ+LEiWrZsmW28tOnT6t79+6WD+geMWTIENnY2Jg9AgMDzepcuHBBzz77rFxcXFSxYkUNHTpUly9ftlLEKEpJSUkaMmSIatSoIWdnZwUGBurQoUNmdf755x+NGDFCVapUUfny5dWrVy8lJSVZKWIUpfyc/yNHjujJJ5+Um5ubXFxc1KdPH87/LUhKASg1jhw5ourVq6tdu3by8PCQvb29tUMCAKBE8/Dw4CvKi1lgYKBOnz5teqxatcrs9WeffVa//vqroqKitHHjRu3YsUPDhw+3UrQoKoZhKCgoSEePHtWGDRu0b98+1apVS/7+/kpNTTXVe/311/XFF18oMjJS33zzjf766y899dRTVowcRSE/5z81NVXdunWTjY2Nvv76a3333XdKT09Xz549lZmZaeUelCAGAFjR4MGDDUl5PgYPHpytXq1atYxatWplK7ud8PBwo0WLFsYnn3xieHp6GuXKlTNeeukl4/r168a0adMMd3d3w83NzXj77bfN2v3999/G0KFDjapVqxoVKlQwOnXqZMTHx5teP3z4sPH4448b1apVM8qVK2e0adPGiIqKMttGrVq1jHfeeccIDg42ypcvb3h6ehofffRRkRxHACiJ/Pz8jJCQEGPkyJFGxYoVjWrVqhkLFy40Ll++bAwZMsQoX768UbduXWPz5s2mNr/88osRGBholCtXzqhWrZoxYMAA4+zZs6bXv/zyS+Phhx82XF1djcqVKxs9evQwDh8+bHr92LFjhiTjv//9r9GxY0ejbNmyRvPmzY1du3bdNt7t27dnew8KDw83DMMwLly4YAwcONCoWLGiUbZsWSMwMND4448/TG2XLFliuLq6mp6fOXPG8Pb2NoKCgox//vnHyMjIMKZMmWJ4eXkZTk5ORvPmzY3IyMhs+962bZvh7e1tlC1b1vD19TUOHDhw27iXLFmSLe4lS5YYhmEYkoz//e9/ZsdmzZo1Rvv27Q0nJyejTZs2xsGDB43du3cb3t7eRrly5YzAwEDjzJkzZvtYtGiR0bBhQ8PR0dFo0KCBMX/+/NvGdTfw8/MzRowYYYwYMcJwcXExqlSpYowbN87IzMw0DOPGOOaJJ57Itf1vv/1mSDJ+/PFHU9mXX35p2NjYGKdOnSru8HGH8jr/Bw8eNCQZ+/fvN9XPyMgw3NzcjEWLFhmGYRgXL140ypQpY3at//7774YkIzY21uL9QcHc6fnfunWrYWtrayQnJ5vqXLx40bCxscn2d8K9jJlSAKxq7ty58vX11bBhw3T69Gn9+eefWrt2rSTp4MGDOn36tObOnau5c+fqrbfe0n333afTp0/rxx9/1I8//ihJWrJkiaksP44cOaIvv/xSW7Zs0apVq/TJJ5+oR48e+vPPP/XNN99o2rRpGjdunH744QdTm969e+vMmTP68ssvtXfvXrVu3VpdunTRhQsXJEmXL1/Wo48+qujoaO3bt0+BgYHq2bOnEhISzPY9c+ZMtWnTRvv27dPLL7+sl156SQcPHiyKQwkAJdKyZctUtWpV7d69W6+88opeeukl9e7dW+3atVNcXJy6deumgQMH6sqVK7p48aI6d+6sVq1aac+ePdqyZYuSkpLUp08f0/ZSU1MVGhqqPXv2KDo6Wra2tnryySezfer873//W6NGjVJ8fLweeOAB9evXT9evX88z1nbt2mnOnDlycXExzXoZNWqUpBu3ae3Zs0eff/65YmNjZRiGHn30UV27di3bdk6ePKkOHTqoadOmWrt2rRwdHRUREaHly5drwYIF+vXXX/X6669rwIAB+uabb7LFPXPmTO3Zs0f29vZ67rnnbnuM+/btq3/9619q0qSJKe6+ffvmWj88PFzjxo1TXFyc7O3t1b9/f73xxhuaO3euvv32Wx0+fFgTJkww1V+xYoUmTJigd955R7///rumTJmi8ePHa9myZbeN7W6wbNky2dvba/fu3Zo7d65mzZqljz/+2PR6TEyMqlWrpgYNGuill17S+fPnTa/FxsaqYsWKatOmjanM399ftra2ZuMMlFy5nf+0tDRJkpOTk6mura2tHB0dtXPnTknS3r17de3aNfn7+5vqNGzYUPfff79iY2Mt2xEUyp2c/7S0NNnY2JjNVnVycpKtra2pDsRMKQDW5+fnZ4wcOdL0POvT4r///tus3uzZs7PNhtJNnwDnR3h4uOHs7GykpKSYygICAgwvLy8jIyPDVNagQQMjIiLCMAzD+Pbbbw0XFxfjn3/+MdtW3bp185zp1KRJE+P99983Pa9Vq5YxYMAA0/PMzEyjWrVqxocffpjv+AGgNPHz8zPat29ven79+nWjXLlyxsCBA01lp0+fNs0amDx5stGtWzezbZw8edKQZBw8eDDHfZw9e9aQZPzyyy+GYfzfbKCPP/7YVOfXX381JBm///77bWO+dcaTYRjGH3/8YUgyvvvuO1PZuXPnjLJlyxr/+c9/zNodOHDA8PT0NF599VXTbJp//vnHcHZ2zjZba+jQoUa/fv0MwzCfKZVl06ZNhiTj6tWrt407aybwrZTDTKmbj82qVasMSUZ0dLSpLCIiwmjQoIHped26dY2VK1eabXfy5MmGr6/vbeMq7fz8/IxGjRqZzqVhGMabb75pNGrUyDCMG8dvw4YNxs8//2z873//Mxo1amQ8+OCDxvXr1w3DMIx33nnHeOCBB7Jt183Nzfjggw8s0wkUWl7nPz093bj//vuN3r17GxcuXDDS0tKMqVOnGpJMv8dWrFhhODg4ZNvugw8+aLzxxhsW6wcK507P/5kzZwwXFxdj5MiRRmpqqnH58mUjJCTEkGQMHz7cWt0qcZgpBeCe4+XlpQoVKpieu7u7q3HjxrK1tTUrO3PmjCTpp59+0uXLl00LVGY9jh07piNHjki6MVNq1KhRatSokSpWrKjy5cvr999/zzZTqnnz5qb/29jYyMPDw7QfALgb3fx7z87OTlWqVFGzZs1MZe7u7pKkM2fO6KefftL27dvNftc2bNhQkky/bw8dOqR+/fqpTp06cnFxkZeXlyTl+fu2evXqpn0Uxu+//y57e3v5+PiYyqpUqaIGDRro999/N5VdvXpVHTp00FNPPaW5c+fKxsZGknT48GFduXJFXbt2Nevb8uXLTf0qjrhzc/M+so7/recka5+pqak6cuSIhg4dahb722+/nS32u9VDDz1kOpeS5Ovrq0OHDikjI0PPPPOMHn/8cTVr1kxBQUHauHGjfvzxR8XExFgvYBSp3M6/ra2t1q1bpz/++EOVK1eWs7Oztm/fru7du5uNKVG63cn5d3NzU2RkpL744guVL19erq6uunjxolq3bs3PyE1YJRjAPadMmTJmz21sbHIsy7oV5PLly6pevXqOA8ysb2gaNWqUoqKiNGPGDNWrV09ly5bV008/rfT09Nvum4UOAdzNbvc7N2uwn5mZqcuXL6tnz56aNm1atu1kJWh69uypWrVqadGiRapRo4YyMzPVtGnTPH/f3ryP4uTo6Ch/f39t3LhRo0ePVs2aNSXJ9E1rmzZtMpXd3OZmlog7p33cWnbze6AkLVq0yCwpJ91IMsJcnTp1VLVqVR0+fFhdunTJ8cOn69ev68KFC/Lw8LBSlCgq3t7eio+PV3JystLT0+Xm5iYfHx/T7ZoeHh5KT0/XxYsXzb7VMykpifN/F7jd+Zekbt266ciRIzp37pzs7e1VsWJFeXh4qE6dOlaMvGQhKQXA6hwcHJSRkWH2XJJZWW7KlCmTr3p3onXr1kpMTJS9vb3pE/lbfffddxoyZIiefPJJSTcG8cePHy/WuADgbtO6dWv997//lZeXV47fsHr+/HkdPHhQixYtUocOHSSpyNfluPU9SZIaNWqk69ev64cfflC7du3MYmncuLGpnq2trT799FP1799fnTp1UkxMjGrUqKHGjRvL0dFRCQkJ8vPzK9J484q7KLi7u6tGjRo6evSonn322SLffmlw69pP33//verXr59jUu7PP//U+fPnTUlUX19fXbx4UXv37pW3t7ck6euvv1ZmZma2JB9Kpvycf1dXV0k3ZnLu2bNHkydPlnQjaVGmTBlFR0erV69ekm6smZqQkCBfX18L9QB34k7O/82qVq0q6cb1f+bMGT3++OPFGHXpwpwxAFbn5eWlH374QcePH9e5c+dUq1Yt2djYaOPGjTp79qzpU9rc2kZHRysxMVF///13scTn7+8vX19fBQUF6auvvtLx48e1a9cu/fvf/9aePXskSfXr19e6desUHx+vn376Sf3792cGFAAU0IgRI3ThwgX169dPP/74o44cOaKtW7cqODhYGRkZqlSpkqpUqaKFCxfq8OHD+vrrrxUaGlqkMXh5eeny5cuKjo7WuXPndOXKFdWvX19PPPGEhg0bpp07d+qnn37SgAEDVLNmTT3xxBNm7e3s7LRixQq1aNFCnTt3VmJioipUqKBRo0bp9ddf17Jly3TkyBHFxcXp/fffL7LFwr28vHTs2DHFx8fr3LlzpkV4i8KkSZMUERGh9957T3/88Yd++eUXLVmyRLNmzSqyfZRkCQkJCg0N1cGDB7Vq1Sq9//77GjlypC5fvqzRo0fr+++/1/HjxxUdHa0nnnhC9erVU0BAgKQbCc3AwEANGzZMu3fv1nfffaeQkBA988wzqlGjhpV7hvzI7fxLUmRkpGJiYnT06FFt2LBBXbt2VVBQkLp16ybpRrJi6NChCg0N1fbt27V3714FBwfL19dXDz30kDW7hXy6k/Mv3fhCpu+//15HjhzRZ599pt69e+v1119XgwYNrNWlEoekFACrGzVqlOzs7NS4cWO5ubnp2rVrmjRpksaMGSN3d3eFhITk2nbmzJmKioqSp6enWrVqVSzx2djYaPPmzXrkkUcUHBysBx54QM8884xOnDhhWotj1qxZqlSpktq1a6eePXsqICBArVu3LpZ4AOBuVaNGDX333XfKyMhQt27d1KxZM7322muqWLGibG1tZWtrq9WrV2vv3r1q2rSpXn/9db377rtFGkO7du304osvqm/fvnJzc9P06dMl3fjDwtvbW4899ph8fX1lGIY2b96c7fZESbK3t9eqVavUpEkTde7cWWfOnNHkyZM1fvx4RUREmBIVmzZtUu3atYsk7l69eikwMFCdOnWSm5ubVq1aVSTblaTnn39eH3/8sZYsWaJmzZrJz89PS5cuLbLYS7pBgwbp6tWratu2rUaMGKGRI0dq+PDhsrOz088//6zHH39cDzzwgIYOHSpvb299++23ZrdlrlixQg0bNlSXLl306KOPqn379lq4cKEVe4SCyO38S9Lp06c1cOBANWzYUK+++qoGDhyY7dqbPXu2HnvsMfXq1UuPPPKIPDw8tG7dOmt0BYVwp+f/4MGDCgoKUqNGjfTWW2/p3//+t2bMmGGNrpRYNoZhGNYOAgAAAABKmo4dO6ply5aaM2eOtUOBFXD+722cf8tgphQAAAAAAAAsjqQUgLtKkyZNzL6y+ubHihUrrB0eAMDKunfvnuv7xJQpU6wdXq54fwMA3I24fQ/AXeXEiRO6du1ajq+5u7urQoUKFo4IAFCSnDp1SlevXs3xtcqVK6ty5coWjih/eH8DANyNSEoBAAAAAADA4rh9DwAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAWR1IKAAAAAAAAFkdSCgAAAAAAABZHUgoAAAAAAAAW9/8A7LCsFDtkOh4AAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "This chart displays five latency metrics:\n",
        "\n",
        "**mean_token_time**: the average time it takes to generate each token (in seconds).  \n",
        "**ttft_mean**: Time To First Token, which measures the full initial overhead.  \n",
        "**p50, p90, p99**: the 50th, 90th, and 99th percentiles of per-token time.\n",
        "\n",
        "**P50 (50th percentile or median)**  \n",
        "50% of token generation times are equal to or below this value. It's a robust measure of the “typical case” and less affected by extreme outliers than the mean.\n",
        "\n",
        "**P90 (90th percentile)**  \n",
        "Indicates that 90% of token times fall below this value. This starts to reflect the “bad case,” meaning those tokens that take longer than usual but are not extreme outliers.\n",
        "\n",
        "**P99 (99th percentile)**  \n",
        "Shows that 99% of token times are equal to or below this value. It represents the worst typical case—only 1% of tokens take longer. If your application is sensitive to occasional high latencies (e.g., real-time systems), this metric is critical."
      ],
      "metadata": {
        "id": "8V4k9C1Gh6Ux"
      },
      "id": "8V4k9C1Gh6Ux"
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Throughhput vs Batch Size"
      ],
      "metadata": {
        "id": "Gql8xXlT_1qz"
      },
      "id": "Gql8xXlT_1qz"
    },
    {
      "cell_type": "code",
      "source": [
        "plot_throughput(results, results2)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "id": "lV67gqvAh1S3",
        "outputId": "37a6a9bd-affb-4ee5-dcf9-0d1c0e2d9d7d"
      },
      "id": "lV67gqvAh1S3",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x400 with 1 Axes>"
            ],
            "image/png": "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o2Ztx44dMz1XI3/+/Hh4eLBhwwbT/NjYWHbt2oWfnx8Afn5+3Lhxg/DwcFOfX3/9laSkJCpWrPjI7drb2+Ps7Gz2EhERERGRx0vxUCggWXDIkiVLmhbzsJ49e1K5cmVGjRrFu+++y+7du5k9ezazZ8821dOjRw9GjBiBt7c3+fPnZ9CgQXh6etK0aVPg/hmOevXq0alTJ2bNmkVCQgJBQUG0bNkyRXeEEhERERGRp0tVsChcuPBTz0pcu3bNooL+rUKFCixfvpwBAwYwbNgw8ufPz+TJkwkMDDT16du3L7du3aJz587cuHGDqlWrEhoaioODg6nPwoULCQoKonbt2tjY2NCiRQumTJmSZnWKiIiIiLzuUhUshg4diouLy/Oq5ZEaNWpEo0aNHjvfYDAwbNgwhg0b9tg+2bJlY9GiRc+jPBERERERIZXBomXLlml+S1kREREREXn5pfji7bS+MFtERERERF4dqb4rlIiIiIiIyMNSPBQqKSnpedYhIiIiIiIvsRSfsRAREREREXkcBQsREREREbGYgoWIiIiIiFhMwUJERERERCymYCEiIiIiIhZTsBAREREREYspWIiIiIiIiMUULERERERExGIKFiIiIiIiYjEFCxERERERsZiChYiIiIiIWEzBQkRERERELKZgISIiIiIiFlOwEBERERERiylYiIiIiIiIxRQsRERERETEYgoWIiIiIiJiMQULERERERGxmIKFiIiIiIhYTMFCREREREQspmAhIiIiIiIWU7AQERERERGLKViIiIiIiIjFFCxERERERMRiChYiIiIiImIxBQsREREREbGYgoWIiIiIiFhMwUJERERERCymYCEiIiIiIhZ7qYLFmDFjMBgM9OjRw9R2584dunTpQvbs2cmcOTMtWrTg8uXLZsudO3eOhg0bkilTJtzc3OjTpw/37t17wdWLiIiIiLy6XppgsWfPHr7++mtKlSpl1t6zZ09WrVrFkiVL2Lx5MxcvXqR58+am+YmJiTRs2JC7d++yfft2FixYQHBwMIMHD37RuyAiIiIi8sp6KYJFXFwcgYGBfPPNN2TNmtXUHhMTw9y5c5k0aRJvvfUW5cqVY/78+Wzfvp2dO3cCsH79eg4fPsz333+Pr68v9evXZ/jw4UyfPp27d+9aa5dERERERF4pL0Ww6NKlCw0bNsTf39+sPTw8nISEBLP2okWL4uXlxY4dOwDYsWMHJUuWxN3d3dQnICCA2NhYDh069GJ2QERERETkFZfB2gU8TUhICPv27WPPnj3J5kVFRWFnZ4erq6tZu7u7O1FRUaY+/w4VD+Y/mPco8fHxxMfHm6ZjY2Mt2QURERERkVdeuj5jcf78ebp3787ChQtxcHB4YdsdPXo0Li4upleePHle2LZFRERERF5G6TpYhIeHEx0dTdmyZcmQIQMZMmRg8+bNTJkyhQwZMuDu7s7du3e5ceOG2XKXL1/Gw8MDAA8Pj2R3iXow/aDPwwYMGEBMTIzpdf78+bTfORERERGRV0i6Dha1a9fm4MGDREREmF7ly5cnMDDQ9OeMGTOyYcMG0zJHjx7l3Llz+Pn5AeDn58fBgweJjo429QkLC8PZ2RkfH59Hbtfe3h5nZ2ezl4iIiIiIPF66vsYiS5YslChRwqzNycmJ7Nmzm9o7dOhAr169yJYtG87OznTt2hU/Pz8qVaoEQN26dfHx8eHDDz9k3LhxREVF8fnnn9OlSxfs7e1f+D6JiIiIiLyK0nWwSIkvv/wSGxsbWrRoQXx8PAEBAcyYMcM039bWltWrV/PJJ5/g5+eHk5MTbdq0YdiwYVasWkRERETk1fLSBYtNmzaZTTs4ODB9+nSmT5/+2GXy5s3L2rVrn3NlIiIiIiKvr3R9jYWIiIiIiLwcFCxERERERMRiChYiIiIiImIxBQsREREREbGYgoWIiIiIiFhMwUJERERERCymYCEiIiIiIhZTsBAREREREYu9dA/IExGR1MvXf421S7DImTENrV2CiIg8hYKFiIikf0NcrF2BZYbEWLsCEZHnTkOhRERERETEYgoWIiIiIiJiMQULERERERGxmIKFiIiIiIhYTMFCREREREQspmAhIiIiIiIWU7AQERERERGLKViIiIiIiIjFFCxERERERMRiChYiIiIiImIxBQsREREREbGYgoWIiIiIiFhMwUJERERERCymYCEiIiIiIhZTsBAREREREYspWIiIiIiIiMUULERERERExGIKFiIiIiIiYjEFCxERERERsZiChYiIiIiIWEzBQkRERERELKZgISIiIiIiFlOwEBERERERi6XrYDF69GgqVKhAlixZcHNzo2nTphw9etSsz507d+jSpQvZs2cnc+bMtGjRgsuXL5v1OXfuHA0bNiRTpky4ubnRp08f7t279yJ3RURERETklZaug8XmzZvp0qULO3fuJCwsjISEBOrWrcutW7dMfXr27MmqVatYsmQJmzdv5uLFizRv3tw0PzExkYYNG3L37l22b9/OggULCA4OZvDgwdbYJRERERGRV1IGaxfwJKGhoWbTwcHBuLm5ER4eTvXq1YmJiWHu3LksWrSIt956C4D58+dTrFgxdu7cSaVKlVi/fj2HDx/ml19+wd3dHV9fX4YPH06/fv0YMmQIdnZ21tg1EREREZFXSro+Y/GwmJgYALJlywZAeHg4CQkJ+Pv7m/oULVoULy8vduzYAcCOHTsoWbIk7u7upj4BAQHExsZy6NChR24nPj6e2NhYs5eIiIiIiDzeSxMskpKS6NGjB1WqVKFEiRIAREVFYWdnh6urq1lfd3d3oqKiTH3+HSoezH8w71FGjx6Ni4uL6ZUnT5403hsRERERkVfLSxMsunTpwh9//EFISMhz39aAAQOIiYkxvc6fP//ctykiIiIi8jJL19dYPBAUFMTq1avZsmULuXPnNrV7eHhw9+5dbty4YXbW4vLly3h4eJj67N6922x9D+4a9aDPw+zt7bG3t0/jvRAREREReXWl6zMWRqORoKAgli9fzq+//kr+/PnN5pcrV46MGTOyYcMGU9vRo0c5d+4cfn5+APj5+XHw4EGio6NNfcLCwnB2dsbHx+fF7IiIiIiIyCsuXZ+x6NKlC4sWLeKnn34iS5YspmsiXFxccHR0xMXFhQ4dOtCrVy+yZcuGs7MzXbt2xc/Pj0qVKgFQt25dfHx8+PDDDxk3bhxRUVF8/vnndOnSRWclRERERETSSLoOFjNnzgSgZs2aZu3z58+nbdu2AHz55ZfY2NjQokUL4uPjCQgIYMaMGaa+tra2rF69mk8++QQ/Pz+cnJxo06YNw4YNe1G7ISIiIiLyykvXwcJoND61j4ODA9OnT2f69OmP7ZM3b17Wrl2blqWJiIiIiMi/pOtrLERERERE5OWQrs9YiMhrZIiLtSt4dkNirF2BiIiI1emMhYiIiIiIWEzBQkRERERELKahUCKviHz911i7BIuccbB2BSIiImIJnbEQERERERGLKViIiIiIiIjFFCxERERERMRiChYiIiIiImIxBQsREREREbGYgoWIiIiIiFhMwUJERERERCymYCEiIiIiIhZTsBAREREREYspWIiIiIiIiMUULERERERExGIKFiIiIiIiYjEFCxERERERsZiChYiIiIiIWEzBQkRERERELKZgISIiIiIiFlOwEBERERERiylYiIiIiIiIxRQsRERERETEYgoWIiIiIiJiMQULERERERGxWAZrFyApk6//GmuXYJEzYxpauwQREREReY4ULOTFGOJi7QosMyTG2hWIiIiIpGsaCiUiIiIiIhZTsBAREREREYspWIiIiIiIiMUULERERERExGKvVbCYPn06+fLlw8HBgYoVK7J7925rlyQiIiIi8kp4bYLF4sWL6dWrF1988QX79u2jdOnSBAQEEB0dbe3SREREREReeq9NsJg0aRKdOnWiXbt2+Pj4MGvWLDJlysS8efOsXZqIiIiIyEvvtQgWd+/eJTw8HH9/f1ObjY0N/v7+7Nixw4qViYiIiIi8Gl6LB+RdvXqVxMRE3N3dzdrd3d05cuRIsv7x8fHEx8ebpmNi7j8cLTY29vkW+gRJ8bettu20EGswWrsEy1jxs08pfUesSN+P5+6l/n6AviMvwEv9HdH347l7qb8fYNXvyIPfv0bj09/D1yJYpNbo0aMZOnRosvY8efJYoZpXw0v+3G0Y89LvQbr3Ur/D+n48dy/9O6zvyHP3Ur/D+n48dy/9O5wOviM3b97ExeXJdbwWwSJHjhzY2tpy+fJls/bLly/j4eGRrP+AAQPo1auXaTopKYlr166RPXt2DAbDc6/3VRMbG0uePHk4f/48zs7O1i5H0iF9R+RJ9P2Qp9F3RJ5E3w/LGI1Gbt68iaen51P7vhbBws7OjnLlyrFhwwaaNm0K3A8LGzZsICgoKFl/e3t77O3tzdpcXV1fQKWvNmdnZ/2FlifSd0SeRN8PeRp9R+RJ9P14dk87U/HAaxEsAHr16kWbNm0oX748b775JpMnT+bWrVu0a9fO2qWJiIiIiLz0Xptg8d5773HlyhUGDx5MVFQUvr6+hIaGJrugW0REREREUu+1CRYAQUFBjxz6JM+Xvb09X3zxRbLhZSIP6DsiT6LvhzyNviPyJPp+vDgGY0ruHSUiIiIiIvIEr8UD8kRERERE5PlSsBAREREREYspWIiIiIiIiMUULOS52bJlC40bN8bT0xODwcCKFSusXZKkY2PGjMFgMNCjRw9rlyLpRGJiIoMGDSJ//vw4OjpSsGBBhg8fji4NfD2l5P+UyMhI3n77bVxcXHBycqJChQqcO3fuxRcrL9zMmTMpVaqU6VkVfn5+rFu3DoBr167RtWtXihQpgqOjI15eXnTr1o2YmBgrV/3qea3uCiUv1q1btyhdujTt27enefPm1i5H0rE9e/bw9ddfU6pUKWuXIunI2LFjmTlzJgsWLKB48eLs3buXdu3a4eLiQrdu3axdnrxgT/s/5eTJk1StWpUOHTowdOhQnJ2dOXToEA4ODlaoVl603LlzM2bMGLy9vTEajSxYsIAmTZrw+++/YzQauXjxIhMmTMDHx4ezZ8/y8ccfc/HiRX788Udrl/5K0V2h5IUwGAwsX77c9ORzkQfi4uIoW7YsM2bMYMSIEfj6+jJ58mRrlyXpQKNGjXB3d2fu3LmmthYtWuDo6Mj3339vxcrE2h71f0rLli3JmDEj3333nfUKk3QlW7ZsjB8/ng4dOiSbt2TJEj744ANu3bpFhgw6zp5WNBRKRKyqS5cuNGzYEH9/f2uXIulM5cqV2bBhA8eOHQNg//79bN26lfr161u5MklvkpKSWLNmDYULFyYgIAA3NzcqVqyoIbivqcTEREJCQrh16xZ+fn6P7BMTE4Ozs7NCRRrTuykiVhMSEsK+ffvYs2ePtUuRdKh///7ExsZStGhRbG1tSUxMZOTIkQQGBlq7NElnoqOjiYuLY8yYMYwYMYKxY8cSGhpK8+bN2bhxIzVq1LB2ifICHDx4ED8/P+7cuUPmzJlZvnw5Pj4+yfpdvXqV4cOH07lzZytU+WpTsBARqzh//jzdu3cnLCxMY6DlkX744QcWLlzIokWLKF68OBEREfTo0QNPT0/atGlj7fIkHUlKSgKgSZMm9OzZEwBfX1+2b9/OrFmzFCxeE0WKFCEiIoKYmBh+/PFH2rRpw+bNm83CRWxsLA0bNsTHx4chQ4ZYr9hXlIKFiFhFeHg40dHRlC1b1tSWmJjIli1bmDZtGvHx8dja2lqxQrG2Pn360L9/f1q2bAlAyZIlOXv2LKNHj1awEDM5cuQgQ4YMyY5OFytWjK1bt1qpKnnR7OzsKFSoEADlypVjz549fPXVV3z99dcA3Lx5k3r16pElSxaWL19OxowZrVnuK0nBQkSsonbt2hw8eNCsrV27dhQtWpR+/fopVAi3b9/Gxsb8UkBbW1vT0WmRB+zs7KhQoQJHjx41az927Bh58+a1UlVibUlJScTHxwP3z1QEBARgb2/PypUrdab8OVGwkOcmLi6OEydOmKZPnz5NREQE2bJlw8vLy4qVSXqQJUsWSpQoYdbm5ORE9uzZk7XL66lx48aMHDkSLy8vihcvzu+//86kSZNo3769tUsTK3ja/yl9+vThvffeo3r16tSqVYvQ0FBWrVrFpk2brFe0vDADBgygfv36eHl5cfPmTRYtWsSmTZv4+eefiY2NpW7duty+fZvvv/+e2NhYYmNjAciZM6cOZKUh3W5WnptNmzZRq1atZO1t2rQhODj4xRck6V7NmjV1u1kxuXnzJoMGDWL58uVER0fj6elJq1atGDx4MHZ2dtYuT16wlPyfMm/ePEaPHs2FCxcoUqQIQ4cOpUmTJi+4UrGGDh06sGHDBi5duoSLiwulSpWiX79+1KlT57HfHbgfUPPly/dii32FKViIiIiIiIjF9BwLERERERGxmIKFiIiIiIhYTMFCREREREQspmAhIiIiIiIWU7AQERERERGLKViIiIiIiIjFFCxERERERMRiChYiIiIiImIxBQsREUmXgoODcXV1TbP1nTlzBoPBQERERJqtU0RE/qFgISIij9W2bVsMBoPplT17durVq8eBAwdStZ4hQ4bg6+v7fIpMoTx58nDp0iVKlChh1TpERF5VChYiIvJE9erV49KlS1y6dIkNGzaQIUMGGjVqZO2yUs3W1hYPDw8yZMhg7VJERF5JChYiIvJE9vb2eHh44OHhga+vL/379+f8+fNcuXLF1Kdfv34ULlyYTJkyUaBAAQYNGkRCQgJwf0jT0KFD2b9/v+nMR3BwMAA3btzgo48+wt3dHQcHB0qUKMHq1avNtv/zzz9TrFgxMmfObAo5j3P9+nUCAwPJmTMnjo6OeHt7M3/+fCD5UKiHz8Y8eG3atAmA+Ph4evfuzRtvvIGTkxMVK1Y0zRMRkeR02EZERFIsLi6O77//nkKFCpE9e3ZTe5YsWQgODsbT05ODBw/SqVMnsmTJQt++fXnvvff4448/CA0N5ZdffgHAxcWFpKQk6tevz82bN/n+++8pWLAghw8fxtbW1rTe27dvM2HCBL777jtsbGz44IMP6N27NwsXLnxkfYMGDeLw4cOsW7eOHDlycOLECf7+++9H9v3qq68YM2aMaXrMmDH873//o2jRogAEBQVx+PBhQkJC8PT0ZPny5dSrV4+DBw/i7e1t8XspIvKqUbAQEZEnWr16NZkzZwbg1q1b5MqVi9WrV2Nj889J788//9z053z58tG7d29CQkLo27cvjo6OZM6cmQwZMuDh4WHqt379enbv3k1kZCSFCxcGoECBAmbbTkhIYNasWRQsWBC4/2N/2LBhj6313LlzlClThvLly5tqeRwXFxdcXFwAWLZsGV9//TW//PILHh4enDt3jvnz53Pu3Dk8PT0B6N27N6GhocyfP59Ro0Y99X0TEXndKFiIiMgT1apVi5kzZwL3hxrNmDGD+vXrs3v3bvLmzQvA4sWLmTJlCidPniQuLo579+7h7Oz8xPVGRESQO3duU6h4lEyZMplCBUCuXLmIjo5+bP9PPvmEFi1asG/fPurWrUvTpk2pXLnyE+v4/fff+fDDD5k2bRpVqlQB4ODBgyQmJiarLT4+3uxMjYiI/EPBQkREnsjJyYlChQqZpufMmYOLiwvffPMNI0aMYMeOHQQGBjJ06FACAgJwcXEhJCSEiRMnPnG9jo6OT912xowZzaYNBgNGo/Gx/evXr8/Zs2dZu3YtYWFh1K5dmy5dujBhwoRH9o+KiuLtt9+mY8eOdOjQwdQeFxeHra0t4eHhZkOzANPZGxERMadgISIiqWIwGLCxsTFdu7B9+3by5s3LwIEDTX3Onj1rtoydnR2JiYlmbaVKleLChQscO3bsiWctUitnzpy0adOGNm3aUK1aNfr06fPIYHHnzh2aNGlC0aJFmTRpktm8MmXKkJiYSHR0NNWqVUuz2kREXmUKFiIi8kTx8fFERUUB94dCTZs2jbi4OBo3bgyAt7c3586dIyQkhAoVKrBmzRqWL19uto58+fJx+vRp0/CnLFmyUKNGDapXr06LFi2YNGkShQoV4siRIxgMBurVq/dMtQ4ePJhy5cpRvHhx4uPjWb16NcWKFXtk348++ojz58+zYcMGsztcZcuWjcKFCxMYGEjr1q2ZOHEiZcqU4cqVK2zYsIFSpUrRsGHDZ6pPRORVptvNiojIE4WGhpIrVy5y5cpFxYoV2bNnD0uWLKFmzZoAvP322/Ts2ZOgoCB8fX3Zvn07gwYNMltHixYtqFevHrVq1SJnzpz873//A2Dp0qVUqFCBVq1a4ePjQ9++fZOd2UgNOzs7BgwYQKlSpahevTq2traEhIQ8su/mzZu5dOkSPj4+pv3LlSsX27dvB2D+/Pm0bt2aTz/9lCJFitC0aVP27NmDl5fXM9cnIvIqMxifNFhVREREREQkBXTGQkRERERELKZgISIiIiIiFlOwEBERERERiylYiIiIiIiIxRQsRERERETEYgoWIiIiIiJiMQULERERERGxmIKFiIiIiIhYTMFCREREREQspmAhIiIiIiIWU7AQERERERGLKViIiIiIiIjF/g/hofot6Gzn7QAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "**Throughput vs Batch Size**  \n",
        "This chart shows the number of tokens generated per second as a function of the batch size used during generation.\n",
        "\n",
        "- At **batch=1**, all the overhead from invoking the model is applied to a single prompt, resulting in low throughput.  \n",
        "- As batch size increases, the cost of kernel launches and data transfers is better amortized, so throughput grows almost linearly up to a saturation point.  \n",
        "- With **batch=32**, the GPU is nearly fully utilized and reaches its maximum throughput. Beyond this point, memory limits or resource contention may prevent further gains.\n",
        "\n",
        "This experiment helps identify the “sweet spot” for batch size, where tokens per second are maximized without exceeding the GPU’s capacity.\n",
        "\n",
        "The chart clearly shows that performance (in tokens per second) increases as batch size grows:\n",
        "\n",
        "* At batch=1, throughput is around 50 tokens/s.  \n",
        "* At batch=4, it jumps to ≈170 tokens/s.  \n",
        "* At batch=8, it reaches ≈330 tokens/s.  \n",
        "* At batch=16, another jump to ≈660 tokens/s.  \n",
        "* Finally, at batch=32, it peaks at ≈1,300 tokens/s.\n",
        "\n",
        "In summary, each time the batch size doubles, throughput nearly doubles as well, showing an almost linear scale in this range. There are no visible inflection points—performance grows steadily up to 32 prompts per batch.\n",
        "\n",
        "### Model Comparison  \n",
        "The chart also shows that for small batch sizes, both models perform similarly, but as the batch size increases, the pruned model clearly outperforms the base model.\n",
        "\n",
        "* At batch 16, it gains ≈120 additional tokens/s (~20% more).  \n",
        "* At batch 32, the advantage increases to ≈125 tokens/s (~11% more).\n",
        "\n",
        "This indicates that “Model 2” amortizes inference costs more efficiently at larger batch sizes.\n"
      ],
      "metadata": {
        "id": "cfK9OIotvIhj"
      },
      "id": "cfK9OIotvIhj"
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Plot Memory Scaling"
      ],
      "metadata": {
        "id": "nTCapNnOEFRq"
      },
      "id": "nTCapNnOEFRq"
    },
    {
      "cell_type": "code",
      "source": [
        "plot_memory_scaling(results, results2)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "id": "8GH6NIeFcfL_",
        "outputId": "6e71b954-1670-47a3-9b89-664804bf8a42"
      },
      "id": "8GH6NIeFcfL_",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "This chart shows the GPU peak memory usage (in MB) measured during the generation of a single token, depending on the context length (number of prompt tokens) for two models:\n",
        "\n",
        "* The X-axis marks different context lengths: 512, 1024, 2048, and 4096 tokens.  \n",
        "* The Y-axis shows the maximum memory used in each case.\n",
        "\n",
        "Each point reflects how much GPU memory is consumed when the model processes a prompt of that length.\n",
        "\n",
        "#### Model Comparison  \n",
        "As shown, the pruned model consistently consumes less GPU memory. The gap between the two models widens as the context window becomes larger."
      ],
      "metadata": {
        "id": "oI3fKj_6J1Kt"
      },
      "id": "oI3fKj_6J1Kt"
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Environmental and energy consumption data"
      ],
      "metadata": {
        "id": "ZBYcCVD8O6Uv"
      },
      "id": "ZBYcCVD8O6Uv"
    },
    {
      "cell_type": "code",
      "source": [
        "plot_environmental_comparison(results, results2)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 354
        },
        "id": "IWCHBOxaEEaQ",
        "outputId": "44d24b62-8933-49c3-f0b9-309fa8e69459"
      },
      "id": "IWCHBOxaEEaQ",
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1400x400 with 3 Axes>"
            ],
            "image/png": "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u9i5cyf69euHpk2bYuLEibwCk4iICjW134iMiIiIiIiIqEyZMnBzc8OKFSvQpEkTaGtrq9R58OABNmzYgC5duuC3335Dv3791BApERFR3mPSloiIiIiIiNTu0KFDKF++/Cfr2NvbY/z48Rg9ejQePnyYT5ERERHlPw11B0BERERERET0uYTth7S1teHk5JSH0RAREakXk7ZERERERERU4Lx58wYTJ07E5MmT8fTpU6ncz89PjVERERHlDyZtiYiIiIiIqMDp0qULUlJSkJycjOrVqyMoKAgAEBoaqubIiIiI8h7ntCUiIiIiIqICJykpCX/++ScAoG/fvujcuTNu3ryp5qiIiIjyB0faEhERERERUYGTmpqK5ORkAECpUqUQFhaGK1euIDw8XM2RERER5T0mbYmIiIiIiKjAWbBgAWJjY6XHenp62Lp1KzZu3KjGqIiIiPIHk7ZERERERERU4JQpUwYPHjzA2bNnER0dLZW3b99efUERERHlEyZtiYiIiIiIqMCIjIxEy5YtUbRoUdSqVQu1atVC0aJF0apVK0RGRqo7PCIionzBG5ERERERERFRgfDo0SPUrl0b2tramDp1KsqXLw8AuH79OgICAuDm5oaIiAiUKFFCzZESERHlLSZtiYiIiIiIqECYPHkyypYti4MHD0JXV1cq9/b2xsiRI9G8eXNMnjwZK1euVGOUREREeY9JWyIiIiIiIioQDhw4gKCgIKWErYKenh6mTp2KLl26qCEyIiKi/MU5bYmIiAqRP//8EzKZDCNGjFB3KERERDn26tUrODg4ZLnc0dERb968yb+AiIiI1IRJWyIiokIiIiICy5YtQ+XKldUdChER0RextrbG9evXs1x+9epVWFlZfdU6eIKTiIi+BUzaEhERFQLx8fHo3r07VqxYAVNTU3WHQ0RE9EW8vb0xevRovHz5UmXZixcvMHbsWHh7e39x+zzBSURE3wrOaUtERJTPoqOjsWPHDpw4cQIPHjzAu3fvYGFhgapVq6JZs2aoU6dOjtv09fVFy5Yt4enpiT/++OOTdZOTk5GcnCw9jo2NzfH6iIiI8sKkSZOwb98+ODk54YcffkC5cuUghMCNGzewYcMGWFlZYeLEiV/U9ocnOD/VV7KfJCKigoAjbYmIiPLJkydP8NNPP8Ha2hp//PEHEhMTUaVKFTRu3BglSpRAcHAw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3Nwcly9fxsiRI1G/fn1Urlw5h5tKRESkfvfv38exY8cQGhqKVatWYdKkSdDX10fdunWlm33WqFEDGhrZPq9KREREREREhUyOb0RWpEgReHl5wcvLCwDw5s0bzJ07F4sWLcJff/2FtLS0bLcVEBAAIGPqhQ8FBgaiV69e0NHRwZEjRzB//nwkJCTA1tYWHTp0wO+//57TsImIiAoEe3t79O7dG7179wYA/PfffwgJCUFISAgCAgLw22+/wdDQENHR0eoNlIiIiIiIiNQmx0nb9PR0RERESAeY4eHhiI+Ph52dHdq3b5+jtoQQn1xua2urckdtIiKiwsTR0RGampqQyWSQyWTYuXMnUlJS1B0WERERERERqVG2k7YzZ86UkrRxcXEoXrw4GjRogPnz56Nhw4bZmo+WiIiIgIcPHyIkJATBwcEICQnBq1evUKdOHbi7u2PPnj3STTeJiIi+V+3atYNMJlMpl8lk0NXVRalSpdCtWzeULVtWDdERERHlvWwnbefPn48GDRpg9uzZaNiwIUqVKpWXcRERERVKjo6OePv2LerWrYv69etjwIABqF69OrS0cnzxCxERUaFlbGyMnTt3wsTEBK6urgCA8+fPIzo6Gk2bNkVQUBBmzJiBo0ePom7dumqOloiIKPdl+wjxyZMneRkHERHRdyExMREAoKGhAS0tLWhra0NTU1PNURERERUsVlZW6NatGxYvXizdnDM9PR3Dhw+HoaEhNm3ahIEDB2Ls2LEICwtTc7RERES5L1u3pn748GGOGo2KivqiYIiIiAq7p0+f4tSpU2jRogXOnDmDli1bwtTUFK1atcLs2bMRERGB9PR0dYdJRESkVqtWrcKIESOkhC2QccJz6NChWL58OWQyGYYMGYKrV6+qMUoiIqK8k62kbY0aNTBgwABERERkWScmJgYrVqxAxYoVsW3btlwLkIiIqLApV64cBg4ciKCgIDx79kxK4v77779o0qQJzMzM1B0iERGRWr1//x43b95UKb958ybS0tIAALq6upnOe0tERFQYZGt6hOvXr2PatGlo0qQJdHV14erqChsbG+jq6uLt27e4fv06rl27hmrVqmHmzJlo0aJFXsdNRERUKDx//hyXL1/G5cuXcenSJcTGxkIul6s7LCIiIrX68ccf0bdvX/z666+oUaMGACAiIgLTp09Hjx49AAChoaFw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6GhER0ejffv2uHXrFtzd3fMiRiIiokJn7969mDRpklKZ4mD0/fv3aoqKiIioYDh06BBWrFiB+fPnAwDi4uLQpEkTyGQyHDhwQL3BERER5YMcj7QFABsbG95wjIiI6CscOnQI7u7uMDU1xYgRIxAXF4dmzZpBS0sL+/fvV3d4REREauXk5IQDBw6gYcOG0NDQwMaNGyGXy7F3714YGBioOzwiIqI890VJ27dv32LVqlW4ceMGAKBChQro3bs3zMzMcjU4IiKiwooHo0RERJ9WuXJl7NmzB02aNEGtWrWwZ88e3oCMiIi+GzlO2h4/fhytW7eGsbExqlevDgBYuHAhpkyZgt27d6N+/fq5HiQREVFhxINRIiKi/1O1alXIZDKVcrlcjidPnqBu3bpS2fnz5/MzNCIionyX46Str68vOnfujICAAGhqagIA0tLSMHjwYPj6+uLKlSu5HiQREVFhwINRIiKirHl7e6s7BCIiogIjx0nbu3fvYuvWrVLCFgA0NTUxatQorF27NleDIyIiKkx4MEpERJS1j2/QSURE9D3LcdK2WrVquHHjBsqWLatUfuPGDbi4uORaYERERIUND0aJiIhy5ty5c9K9VJydnVG1alU1R0RERJQ/cpy0HTZsGIYPH467d++idu3aAIDTp09jyZIl+PPPP3H58mWpbuXKlXMvUiIiokKIB6NERESqXrx4gS5duiAkJAQmJiYAgOjoaDRs2BCbNm2ChYWFegMkIiLKYzlO2nbt2hUAMGbMmEyXyWQyCCEgk8mQlpb29RESEREVQjwYJSIiytrQoUMRFxeHa9euoXz58gCA69evo2fPnhg2bBg2btyo5giJiIjyVo6Ttvfv38+LOIiIiL4rPBglIiLK2oEDB3DkyBGpjwSAChUqYMmSJWjatKkaIyMiIsofOU7a2tvb50UcRERE3xUejBIREWUtPT0d2traKuXa2tpIT09XQ0RERET5S0PdARAREX2PeDBKRESUtUaNGmH48OF48uSJVBYVFYWRI0eicePGaoyMiIgofzBpS0REpAY8GCUiIsra4sWLERsbCwcHBzg5OcHJyQklS5ZEbGwsFi1apO7wiIiI8lyOp0cgIiKir7d48WK0adMGDg4OsLW1BQA8evQIFStWxLp169QcHRERkXrZ2tri/PnzOHLkCG7evAkAKF++PDw9PdUcGRER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r1q1Ktd+XFycypcvr61bt6pFixb5FR8AgHxVsmRJpaamqmrVqvr88881bNgwSb/d0PPcuXOmzkWvBAAURqavtG3durUGDBig7du3e49t375dgwYNUps2bSRJu3btUo0aNfIuJQAARVS5cuU0bNgwff/995o9e7bWrl2rBx98UJUqVdKECROUlZVl6nxpaWmSpNDQ0Gs+Jzs7W+np6bk2AADspF27dnriiSf0xBNPKDExUR07dpQk/fDDD6pevfqfOveNeiV9EgBgB6aHtgsWLFBoaKjuuusuuVwuuVwu3X333QoNDdWCBQsk/fap6KxZs/I8LAAARc3x48c1Y8YMRUREaPTo0XrwwQe1bt06zZo1S8uXL1dMTMxNn8vtduu5557TX/7yF9WtW/eaz5s2bZqCg4O9GzcOBQDYzbx583Tvvffq5MmTWrZsmfemY1u3blWvXr3+8HlvplfSJwEAdmB6eYSKFStqzZo12rNnjxITEyVJtWvXVu3atb3Pad26dd4lBACgCFq+fLneeecdrV69WhEREXr66afVp08flS5d2vuc++67T7fffvtNn3Pw4MHavXv3NW9udtmYMWO8XzOVpPT0dN6QAgBspXTp0po7d+4VxydOnPinznszvZI+CQCwA9ND28vq1KmjOnXq5GUWAAAco1+/furZs6fWr1+vxo0bX/U5lSpV0rhx427qfM8884z+9a9/6ZtvvlHlypWv+9zL35QBAMDOzpw5o82bN+vEiRNyu93e44Zh6JFHHjF9vpvtlfRJAIAd/KGh7S+//KL4+HgdPnxYFy5cyPXY7Nmz8yQYAABF2bFjxxQQEHDd5/j7+ys2Nva6z/F4PHr22Wf18ccf66uvvmJNeQBAkfDpp5+qd+/eysjIUFBQkAzD8D5mdmhLrwQAFEamh7br1q1TdHS0atasqT179qhu3br6+eef5fF41KhRo/zICABAkXPp0qWr3tjEMAy5XC6VKFHips4zePBgffjhh/rkk09UqlQpJScnS5KCg4Pl7++fp5kBACgow4cPV//+/TV16tQbfsh5I/RKAEBhZPpGZGPGjNGIESO0a9cu+fn5admyZTpy5Ihatmyp7t2750dGAACKnNKlSyskJOSKrXTp0vL391e1atUUGxub6+ugV/PGG28oLS1NrVq1UlhYmHdbsmRJAf1NAADIe7/++quGDBnypwe2Er0SAFA4mb7S9qefftLixYt/++FixXTu3DmVLFlSkyZNUpcuXTRo0KA8DwkAQFETFxencePG6bHHHlOTJk0kSZs3b9a7776r8ePH6+TJk5o5c6ZcLpfGjh17zfN4PJ6CigwAQIGJjIzUli1bVLNmzT99LnolAKAwMj20DQwM9K5jGxYWpv379+uOO+6QJKWkpORtOgAAiqh3331Xs2bNUo8ePbzHoqKiVK9ePb355ptat26dqlatqilTplx3aAsAQFHUqVMnPf/88/rxxx9Vr149FS9ePNfj0dHRFiUDAKBgmB7a3nPPPUpISNDtt9+ujh07avjw4dq1a5eWL1+ue+65Jz8yAgBQ5GzYsEHz58+/4njDhg21ceNGSVKzZs10+PDhgo4GAIDlnnzySUnSpEmTrnjMMAzl5OQUdCQAAAqU6TVtZ8+eraZNm0qSJk6cqLZt22rJkiWqXr26FixYkOcBAQAoiqpUqXLVvrlgwQJVqVJFkpSamqqQkJCCjgYAgOXcbvc1Nwa2AAAnMHWlbU5Ojn755RfVr19f0m9LJVztKiEAAHB9M2fOVPfu3fXZZ5+pcePGkqQtW7Zoz549+uc//ylJ+u677/TQQw9ZGRMAAAAAYAFTV9r6+vrqr3/9q06fPp1feQAAcITo6Gjt3btXHTt21KlTp3Tq1Cl16NBBe/bsUefOnSVJgwYN0uzZsy1OCgCANb7++mtFRUUpPDxc4eHhio6O1rfffmt1LAAACoTpNW3r1q2rAwcOqEaNGvmRBwCAIu/ixYtq37695s+fr2nTplkdBwAA2/nggw/Ur18/de3aVUOGDJEkrV+/Xm3btlVcXJwefvhhixMCAJC/TA9tX3rpJY0YMUKTJ0/WXXfdpcDAwFyPBwUF5Vk4AACKouLFi+v777+3OgYAALY1ZcoUzZgxQ0OHDvUeGzJkiGbPnq3JkycztAUAFHmmb0TWsWNH7dy5U9HR0apcubJCQkIUEhKi0qVLc7MUAABuUp8+fbiBJwAA13DgwAFFRUVdcTw6OloHDx60IBEAAAXL9JW2X375ZX7kAADAUS5duqSFCxdq7dq1V/3mCmvZAgCcrEqVKlq3bp3Cw8NzHV+7dq2qVKliUSoAAAqO6aFty5Yt8yMHAACOsnv3bjVq1EiSlJiYmOsxwzCsiAQAgG0MHz5cQ4YM0Y4dO3TfffdJ+m1N27i4OL322msWpwMAIP+ZHtpK0rfffqs333xTBw4c0EcffaRbbrlF77//vmrUqKFmzZrldUYAAIocvrkCAMC1DRo0SBUrVtSsWbO0dOlSSdLtt9+uJUuWqEuXLhanAwAg/5le03bZsmWKjIyUv7+/tm3bpuzsbElSWlqapk6dmucBAQAoypKSkrR69WqdO3dOkuTxeCxOBACAPTzwwANKSEhQamqqUlNTlZCQwMAWAOAYpoe2L730kubPn6+33npLxYsX9x7/y1/+om3btpk61zfffKOoqChVqlRJhmFoxYoVuR73eDyaMGGCwsLC5O/vr/vvv1/79u0zGxkAANtJTU1V27Ztddttt6ljx446duyYJOnxxx/X8OHDLU4HAAAAALCS6aHt3r171aJFiyuOBwcH68yZM6bOlZmZqQYNGmjevHlXfXzGjBl6/fXXNX/+fP3nP/9RYGCgIiMjdf78ebOxAQCwlaFDh6p48eI6fPiwAgICvMcfeughrVq1ysJkAABYIzQ0VCkpKZKkkJAQhYaGXnMDAKCoM72mbcWKFZWUlKTq1avnOp6QkKCaNWuaOleHDh3UoUOHqz7m8Xg0Z84cjR8/3vsVmPfee08VKlTQihUr1LNnz6v+XHZ2tnfJBklKT083lQkAgILw+eefa/Xq1apcuXKu47Vq1dKhQ4csSgUAgHVeffVVlSpVyvtnbswJAHAy00PbJ598Un/729+0cOFCGYaho0ePauPGjRoxYoReeOGFPAt28OBBJScn6/777/ceCw4OVtOmTbVx48ZrDm2nTZumiRMn5lkOAADyQ2ZmZq4rbC87deqUXC6XBYkAALBW3759vX9+7LHHrAsCAIANmF4eYfTo0Xr44YfVtm1bZWRkqEWLFnriiSc0YMAAPfvss3kWLDk5WZJUoUKFXMcrVKjgfexqxowZo7S0NO925MiRPMsEAEBead68ud577z3vvmEYcrvdmjFjhlq3bm1hMgAArLdt2zbt2rXLu//JJ58oJiZGY8eO1YULFyxMBgBAwTB9pa1hGBo3bpyef/55JSUlKSMjQxERESpZsmR+5DPN5XJxhRIAwPZmzJihtm3basuWLbpw4YJGjhypH374QadOndL69eutjgcAgKUGDBig0aNHq169ejpw4IAeeughde3aVR999JGysrI0Z84cqyMCAJCvTF9p+8EH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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "In this set of charts, you're looking at three different metrics that describe the energy and emissions impact of text generation:\n",
        "\n",
        "**Average power (W)**  \n",
        "Shows the average electrical power consumed by the GPU during the entire benchmarking process (i.e., how many watts it was drawing while generating tokens). It's a direct measure of the inference workload on the hardware.\n",
        "\n",
        "**Energy per token (kWh/token)**  \n",
        "Divides the total energy consumed (in kWh) by the number of tokens generated. It indicates how much energy is \"spent\" to produce a single token — the lower this value, the more energy-efficient the model is.\n",
        "\n",
        "**Emissions per token (kg CO₂/token)**  \n",
        "Converts the same per-token energy into estimated CO₂ emissions (in kilograms) using standard emission factors. This helps quantify the environmental cost of generating each token, making it easier to compare sustainability across models or configurations.\n",
        "\n",
        "Together, these charts help you understand not just GPU speed or total consumption, but also the energy and ecological cost of each unit of text produced by the model."
      ],
      "metadata": {
        "id": "z4OgfeJsPR7v"
      },
      "id": "z4OgfeJsPR7v"
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Conclusions\n",
        "When developing optimized models using techniques like structured pruning, it's essential not only to evaluate performance in terms of accuracy or task-specific quality, but also to measure efficiency-related metrics such as latency, throughput, memory usage, and energy consumption.\n",
        "\n",
        "These metrics help us:\n",
        "\n",
        "* Quantify real-world inference speed improvements\n",
        "* Detect resource savings in constrained environments (e.g., edge devices or cloud services)\n",
        "* Evaluate the environmental impact of different architectures or optimization strategies\n",
        "* Make informed decisions when choosing between multiple versions of a model\n",
        "\n",
        "This notebook provides a structured and reproducible workflow to compare base models against their optimized counterparts.\n",
        "\n",
        "*Note: All experiments have been run on Google Colab, using its default hardware configuration (typically a Tesla T4 GPU). Due to resource allocation and system load, results may vary slightly between runs. For consistent benchmarking, it's recommended to repeat the process several times or use a dedicated environment.*\n",
        "\n",
        "# Authors Note.\n",
        "\n",
        "In addition to creating content like this notebook and offering it under the MIT license, I have also contributed to repositories such as those of Hugging Face and Google Gemini.\n",
        "\n",
        "I am especially proud of my book: [Large Language Models: Apply and Implement Strategies for Large Language Models (Apress)](https://amzn.to/3DSepLb).\n",
        "\n",
        "You can find it on both [Amazon](https://amzn.to/3DSepLb) and [Springer](https://link.springer.com/book/10.1007/979-8-8688-0515-8), where they often have good deals on the purchase price.\n",
        "\n",
        "If you take a look and end up purchasing it, keep in mind that you can reach out with any questions via the Discussions section of this same repository or on any of my social media channels. I’ll do my best to respond as quickly as possible.\n",
        "\n",
        "🚀 If you'd like to stay updated on my work, or even discuss some ideas, feel free to connect with me on [LinkedIn](https://www.linkedin.com/in/pere-martra/) or follow me on [X (Twitter)](https://x.com/PereMartra). I regularly share new tools, techniques, and insights on LLMs and AI optimization.🚀\n"
      ],
      "metadata": {
        "id": "LBKigKQrArgK"
      },
      "id": "LBKigKQrArgK"
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "Lybaj0vlB0QM"
      },
      "id": "Lybaj0vlB0QM",
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "T4",
      "include_colab_link": true
    },
    "language_info": {
      "name": "python"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 5
}